SCTF-Misc400B
一、Binwalk
BinWalk是一个固件的分析工具,旨在协助研究人员对固件进行分析,提取及逆向工程用处。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展。最简单的使用方法很直接,提供文件路径和文件名即可。
BinWalk常用于识别任意二进制数据块中所包含的其他类型的文件数据。
二、ZLib
Zlib是一种用于压缩的函数库,最初用于libpng,所以在PNG图片中能识别出很多Zlib数据块。使用Python自带的zlib库可以方便的对数据块进行压缩和解压缩操作。
三、二维码
二维码共有40种规格,分别为版本1、版本2、…、版本40。其中版本1的规格为21模块×21模块,版本2为25模块×25模块。以此类推,每一个版本符号比前一个版本每边增加4个模块,直到版本40,规格为177模块×177模块。
四、Python Imaging Library
PythonImagingLibrary(简称PIL)为Python解释器提供了图像处理的功能,PIL提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。PIL图像处理库的核心被设计成为能够快速访问以几种基本像素类型表示的图像数据,它为通用图像处理工具提供了一个坚实基础。
结合PIL可以方便的编写Python脚本处理图片隐写问题。
打开PNG图片,从图片内容上看不出有什么可疑的信息。而通常在拿到图片之后,第一个反应就是通过StegSolve工具去查看,实际上这里通过StegSolve也看不到什么异常信息,使用stegdetect同样可以看不出有什么有用的信息。
其他能想到的就是检查文件末尾有没有附加什么特殊的数据,所以这里可以使用binwalk这个工具来检测。
除了Zlib压缩数据块之外,没有看到其他特殊的检测结果。PNG图片带有Zlib压缩数据并不是什么奇怪的事情。不过最后一条记录看起来却有一点奇怪,首先是偏移值0x15AFFB很大,其次使用binwalk对其他正常的PNG文件进行检测的时候,通常都只有两条记录。
后一段Zlib压缩数据存在问题,因此将其提取出来并进行解压缩操作,Python提供了zlib库,可以十分方便的进行zlib解压缩操作。解压缩代码如下:
import zlibif __name__ =="__main__":
fd = open("Misc400B.png","rb")
data = fd.read()
fd.close()
fd = open("data.txt","wb")
data = data[0x15AFFB:]
fd.write(zlib.decompress(data))
fd.close()
执行 后,提取出来的数据存放与data.txt文件,打开发现里面是一串0101字符串,长度为625字节。
得到了一段长度为625字节的数据,625 = 25 * 25,而常用的二维码就是这个规格的,数据本身0101刚好表示两种状态,因此可以尝试生成一张二维码图片。使用如下的代码可以生成一张二维码图片
from PIL import Imageimport zlib
defextractData():
fd = open("Misc400B.png","rb")
data = fd.read()
fd.close()
data = data[0x15AFFB:]
return zlib.decompress(data)
defgenQRCode(data, name, white="1"):
width, height =25,25
img = Image.new("RGB",(width, height),(255,255,255))
pix = img.load()
for y in xrange(0, height):
for x in xrange(0, width):
if white == data[y*25+x]:
pix[x,y]=(255,255,255)
else:
pix[x,y]=(0,0,0)
img.save(name)
if __name__ =="__main__":
data = extractData()
genQRCode(data,"1.bmp","0")
genQRCode(data,"2.bmp","1")
因为不知道0和1谁代表黑谁代表白,因此这里生成了两张相反的二维码图片,其中1.bmp是一个正常的二维码图片,使用Windows自带的照片查看工具将其放大之后,即可进行二维码识别操作