下载解压得12张马里奥图片,题中提示图片里没flag,且题目为拼图,猜测数据分布在这12张图里,010浏览图片,发现每张图片末尾都有很多多余数据,尝试了搜索各类型文件头,没有收获,进一步搜索图片文件结构相关标识,如png的IHDR-49484452,搜到后缀为10的图片时终于有结果了。
令人高兴的是,紧跟着有IDAT标识,基本可以确定这是png的第一块数据块了,以此类推,每张图片都可搜索到IDAT,并且结束在jpg图片的文件尾标识FFD9。
那么思路就清晰了,需要写个脚本读取每张图片信息,并搜索IDAT,以10为第一块将它们接起来
data = [''] * 12
for i in range(12):
data[i] = open('puzzle' + str(i) + '.jpg', 'rb').read()
HEAD = 0x89504E470D0A1A0A.to_bytes(8,'big') #转字节流
IHDR = data[10][0x29EA :0x2A03]
#print(IHDR)
IDAT = [''] * 12
for i in range(12):
n = data[i].find(b'IDAT') - 4
IDAT[i] = data[i][n : -2 ]
#print(IDAT[10])
PNG = HEAD + IHDR + IDAT[10]
for i in range(10):
PNG += IDAT[i]
PNG += IDAT[11]
out = open("666.png", 'wb')
#print(PNG)
out.write(PNG)
out.close()
可以看出图片的第一块数据是正确的,剩下的数据块用tweakpng进行调整,也就20次左右就换出来了,这里就不透露具体顺序的CRC了,确实挺费眼睛的。
调整好在退后一块数据就有flag了