png图片的结构和crc校验

目录

png图片结构

图片的crc校验


png图片结构
 

png图片的结构和crc校验_第1张图片

1、开头的0~7八个字节为png的文件头:89 50 4E 47 0D 0A 1A 0A (固定格式)

2、8~11四个字节:00 00 00 0D 表示头部数据块的长度为13(固定格式)

3、12~15四个字节:49 48 44 52 表示文件头数据块的标示(固定格式)

4、16~19四个字节:00 00 03 84表示图片的宽(不固定)

5、20~23四个字节:00 00 00 96表示图片的高(不固定)

6、24~28五个字节:08 02 00 00 00表示Bit depth(图像深度)、ColorType(颜色类型)、 Compression method(压缩方法)、 Filter method(滤波器方法)、Interlace method(隔行扫描方法)这五个字节不固定,均为可变数据

7、29~32四个字节:76 EC 1E 40为图片的crc校验值由从第12个字节到第28个字节的十七位字节进行crc计算得到

图片的crc校验

png图片的结构和crc校验_第2张图片

拿到这类的题目之后,首先要验证图片的crc值是否正确。打开在线网站:CRC(循环冗余校验)在线计算_ip33.com

输入第12到第28共十七位字节,参数模型选择crc32,点击计算,得到图片crc校验值

png图片的结构和crc校验_第3张图片

校验值为09 DA D1 61,与图片校验值76 EC 1E 40不等,说明该图片crc校验有问题。一般是由于高度或者宽度所引起的,这里需要用到脚本对其宽高进行爆破。

脚本:

import binascii
import struct
 
 
 
crcbp = open("misc25.png", "rb").read()    #打开图片
crc32frombp = int(crcbp[29:33].hex(),16)     #读取图片中的CRC校验值
print(crc32frombp)
 
for i in range(4000):                        #宽度1-4000进行枚举
    for j in range(4000):                    #高度1-4000进行枚举
        data = crcbp[12:16] + \
            struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]
        crc32 = binascii.crc32(data) & 0xffffffff
        # print(crc32)
        if(crc32 == crc32frombp):            #计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
            print(i, j)
            print('hex:', hex(i), hex(j))
            exit(0)

运行,得到正确的宽高

 可以看到高度出了问题,在winhex中修改高度为FA,另存为新的图片,这样就可以看到flag了

png图片的结构和crc校验_第4张图片

png图片的结构和crc校验_第5张图片

你可能感兴趣的:(misc,网络安全,安全)