所谓“双图”是指题目一般会提供两张图片,一张是原图,另一张是有隐写消息的图片,我们需要对这两张图片进行处理,从而提取隐写信息。常见的“双图”解题套路包括:对两张图片对应像素值进行异或、相减、相加或相乘等,还可能涉及盲水印考点。
“双图”隐写案例
【例题】star.bmp
【题目来源】原创
【题目描述】找到文件中的flag
【解题思路】将图像文件在010 Editor中打开,使用BMP模板解析文件,发现在BMP文件尾还有一个JPG文件,如下图所示,将JPG图像手动提取出来,保存为ex.jpg。然后我们对两幅图像做异或、加减乘等操作。
在StegSolve中打开题目原图,如下图所示,单击“Analyse➡️Image Combiner”,打开图像组合器。
然后,选择我们提取出图像ex.jpg,这时会弹出一个新窗口,新窗口等左上角会显示两幅图像的操作。我们多次单击“>”按钮,会发现如下图中的隐写信息。两幅图像相减,会发现一个二维码,扫码得到flag{doublePic}。
图像和像素值的转换
需要从图像中提取像素值,或者题目只提供像素值,需要我们画出原图像。这里读取像素值或根据像素值画图,均要使用Python的PIL库。利用脚本工具getRGB.py用于读取像素点点像素值,RGB2pic.py用于根据像素值画图。
【例题】top.zip
【题目描述】找到文件中的flag
【解题思路】解压后有两个文件,一个是加密脚本,另一个是加密后的图像。脚本中使用异或算法对图像加密。我们修改加密脚本,得到解密脚本top-dec.py,解密脚本中复用了加密脚本中的很多函数,运行解密脚本,需要把该脚本和flag_enc.hex放到同一个路径下,使用Python3运行,即可得到解密后的图像,如下图所示:
图像提示,左上角对角线隐藏信息,需要读取像素值。可以用StegSolve查看,感觉绿色通道有异常,于是修改getRGB.py如下,提取出所有绿色通道像素值:
运行修改后的getRGB.py,得到结果如下:
将其转换为ASCII码,得到:ZmxhZ3todXJyeV91UF80bmRfZjFnaHRfdzF0aF9tM30=Y[\[Y(这个转码可以自己编写脚本实现),再对等号和等号前的字符串进行Base64解码,得到flag{hurry_uP_4nd_f1ght_w1th_m3}。
【例题】misc-1.pcapng
【题目描述】找到文件中的flag
【解题思路】在Wireshark中打开文件,进行协议分级,优先查看HTTP,在HTTP请求中发现flag.zip,如下图所示。输入过滤规则:http contains “flag.zip”,只有一个数据包,再追踪HTTP流,从服务器的返回包中提取一个压缩包,解压后是ce.txt。查看TXT文件,共98 457行,每行3个正整数(以逗号分隔),且其值均在0~255范围内,猜测每行是像素点的RGB值,共98 457个像素。我们需要根据像素值画图,但是缺少图像的宽高信息。于是对98 457进行因数分解,得到98 457=3x37x887,但一般图像的高或宽不会是30+像素,因此猜测图像宽高为111x887。
对RGB2.pic.py脚本修改如下:
只需修改x和y就能生成正确的图像,如下图所示: