由于LSB隐写是在最低位隐藏数据,也就是在比较无关紧要的地方隐藏,因此只有在无损压缩(png)或无压缩(bmp)图片上实现 jpg 属于有损压缩格式,我们修改的信息可能会在压缩的过程中被破坏;而 png 虽然也有压缩,但却是无损压缩,我们修改的信息不会丢失 bmp 图片把所有的像素都按原样储存,没有进行压缩,因此一般会特别的大
工具:stegsolve.jar
正常 < >
Colour Inversion (Xor)
颜色反转,将RGB所表示的二进制 0 1互换
在CTF解题过程中,某一步可能得到一张二维码,但二维码的黑白是相反的,要想扫码得到信息,就需要进行颜色反转(二维码通常由黑白组成,反转对立)
4通道
Alpha plane、Red plane、Green plane、Blue plane
4个通道,每个通道各需要8bit,StegSolve将 4 × 8 = 32 个bit位置的数据都提取出来,单独形成图片显示出来。这恰好对应了上面的LSB隐写
Analyse
File Format —— 文件格式
查看图片的具体信息,有时候flag会隐藏在这里面
它与直接点击图片右键”属性”,查看”详细信息”相辅相成,两者提供的信息有重叠、也有互不相同
Stereogram Solver —— 立体试图
图片与图片自身进行异或运算,因此初始的 offet: 0 时的图像永远是黑屏(对于任意 a,都有a ^ a = 0)
可以控制offset(偏移量)对其中一张进行移动,进行的仍然是异或运算;offset的取值范围是 [0, 图片的宽度-1]
用一张图片试试就知道怎么回事了
Frame Browser —— 帧浏览器
该功能只针对 gif 动图
有时候CTF会将flag隐藏在 gif 动图中,会在 gif 中急速闪过,这时就需要把动图一帧一帧地放;有时候又会把 gif 放映得非常慢,需要手动查看下一帧
Image Combiner —— 图像合并
使用StegSolve打开 1.png,再在Image Combiner中打开 2.png,能够查看两张图片的数据进行多种运算呈现出来的结果
例题: 下载 男神.zip,解压得到两张图片 first.png 和 second.png,两张图片看上去一模一样,明显的双图问题
将 first.png 放入StegSolve中,在Image Combiner中打开 second.png,发现在 SUB (R,G,B separate) 的图像呈现二维码的形状:
然而它并不能直接被扫码
将上图另存为 colorfulQR.bmp,再在StegSolve中打开,左右查看,发现这同时也是一道LSB隐写题,在RGB三色通道的最低位,分别存储了一张二维码
将Red plane 0、Green plane 0、Blue plane 0对应的图像分别导出,得到:
观察发现,这三张二维码都是反色的,需要进行颜色反转处理
再次将三张图片导入StegSolve,进行Colour Inversion处理;把三张处理后的二维码保存,扔到在线二维码解码中,会分别得到 DES、6XaMMbM7 和 一长串被加密的字符串
按照提示是DES加密,密钥为 6XaMMbM7,随便找个在线的DES解密网站,解码字符串得到flag
Data Extract —— 数据提取
在StegSolve的<>切换界面中,StegSolve会自动读取RGBA的各个通道,将各个通道的数据结合打开文件的类型(猜测是加上对应文件的一些格式数据,如 jpg 就添加文件头标识 FF D8、文件尾标识 FF D9),重新生成一张图片,显示在上面
但有时候,flag并不以图片的形式存在,它有可能就以数据的形式藏匿在某个通道的数据中,这时就要通过Data Extract单独浏览数据了
Bit Planes —— 位通道
这里罗列了RGBA四条通道的各8位,如果点击Blue 0,StegSolve将会提取整张图片各个像素点中,代表蓝色深度的8位二进制的最后一位,提取出来的 010101… 可以通过Preview查看
注意这里强调提取出来的是 010101… 的二进制数据,因为Blue的取值有28种,相当于一个8位二进制数值。假设Blue通道各位上的数据是 01010101,初始时8个▢都未勾上,因此读取不到数据;如果勾选了后五个▢,则读取了数据 10101
Preview—— 预览
正如上面举例所示,如果点击的是Blue 0,StegSolve自动提取出来的 10101,由于二进制数需要转十六 进制数,因此需要凑齐8位;对于提取出来的数据不满8位,将会在后面自动填充 0
因此这时候的数据变成了 10101000,它会显示在窗口的左端
我们以某次的数据截图来分析
窗口的数据由两部分组成:左侧是提取出来的数据转十六进制的显示,右侧是这些十六进制对应的Unicode字符
比如第二行第一个的 C,它对应的Unicode码是 67,十进制数 67 的十六进制恰好就是 43
窗口右侧只显示ASCII字符,非ASCII字符都会被 . 代替
kali内的zsteg
zsteg xxx.jpg/xxx.png
要是有异常
这时可以提取异常数据
zsteg -E "extradata:0" xxx.jpg/xxx.png > 1.txt
提取出来的数据可以用foremost或binwalk -e分离