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()用法詳細說明