[CTF] 根据crc码矫正png图片宽高
png的crc校验值就是用下图的高亮部分计算得出:
png的crc校验值如下图高亮部分所示:
根据crc校验码,使用以下python脚本计算正确的png图片宽高
import zlib
import struct
with open(r'C:\Users\Administrator\Desktop\1.png','rb') as image_data:
bin_data = image_data.read()
data = bytearray(bin_data[12:29])
crc32key = eval(str(bin_data[29:33]).replace(r'\x', '').replace("b'", '0x').replace("'", ''))
#理论上0xffffffff,但考虑到屏幕实际,0x0fff就差不多了
n = 4096
#高和宽一起爆破
for w in range(n):
# q为8字节,i为4字节,h为2字节
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print("width:%s height:%s" % (bytearray(width).hex(),
bytearray(height).hex()))
exit()
参考资料:
[CTF隐写]png中CRC检验错误的分析
Python中struct.pack()和struct.unpack()用法详细说明