ctfshowF5杯misc-Just Another 拼图

 下载解压得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了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值