记录一道很有意思的隐写题目
遵循一般步骤,先右键图片属性看详细信息,然后分析十六进制,文件头文件尾等
最后载入stegsolve观察各个通道,注意到 red,green,blue 三个通道0 均有异常,猜测是 lsb隐写
然后进行数据提取
将RGB排列顺序切换到BGR的时候发现PNG文件头,保存为二进制文件
然后载入010 editor打开,去掉头部多余的fffe,此时图片就可以预览了,看到是半个二维码
进行 crc 爆破文件宽度和高度
# coding: utf-8
import os
import binascii
import struct
misc = open("png2.png", "rb").read()
for i in range(1024):
for j in range(1024):
data = misc[12:16] + struct.pack('>i',i) + struct.pack('>i', j) + misc[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0x08ec7edb:
print i, j
也可以直接修改图片高度(windows 会忽略掉错误的crc校验,图片仍可以打开),显示完整二维码
下一步用PS反色,依次 (图像 -> 调整 -> 反相)
扫描二维码,下载到一个rar压缩文件
解压缩打开flag.txt,显示
好吧,其实我心态是崩溃的
注意到解压前压缩包大小 766 b,解压后 63,问题应该出在压缩包上
载入 010 editor
仔细查看发现有个 flag.pyc
不过解压时为什么没有识别出来...
那么现在问题就是怎么把 flag.pyc 提出来了
首先了解一下 rar 文件结构
rar 是由一个一个 block 组成的,每个 block 有以下几个部分
HEAD_CRC 2 全部块或块部分的CRC
HEAD_TYPE 1 块类型
HEAD_FLAGS 2 阻止标志
HEAD_SIZE 2 块大小
ADD_SIZE 4 可选字段 - 添加块大小
手动将 block[1] 的类型改成 file or directory
然后解压会报错但是可以解压成功
我们得到 一个 pyc 文件
在线反编译失败,我们使用 pycdc 反编译成功得到 py 文件
# Source Generated with Decompyle++
# File: STM (Python 2.7)
import base64
def encode():
flag = '*************'
ciphertext = []
for i in range(len(flag)):
s = chr(i ^ ord(flag[i]))
if i % 2 == 0:
s = ord(s) + 10
else:
s = ord(s) - 10
ciphertext.append(str(s))
return ciphertext[::-1]
ciphertext = [
'96',
'65',
'93',
'123',
'91',
'97',
'22',
'93',
'70',
'102',
'94',
'132',
'46',
'112',
'64',
'97',
'88',
'80',
'82',
'137',
'90',
'109',
'99',
'112']
根据 encode 编写 decode 代码
def decode(ciphertext):
flag = ""
text = ciphertext[::-1]
for i in range(len(text)):
s = int(text[i])
if i % 2 == 0:
s = chr(s - 10)
else:
s = chr(s + 10)
s = chr(ord(s) ^ i)
flag += s
print flag
即可得到 flag