[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()用法详细说明

posted @ 2020-11-20 23:13  sec_j  阅读(4926)  评论(0编辑  收藏  举报