png宽高被改,crc无脑爆破

原理

一个图片的CRC码受图片这些参数影响,其中就有宽高

00 00 00 C8 00 00 00 25

通过上面这些数算出的CRC码:

当一个图片只被修改了宽高而没有被修改CRC码时,再通过前面的值去算CRC码就会跟原本的CRC值不一样。


判断

import zlib

image_data=open('图片路径','rb')
bin_data=image_data.read()
crc32key = zlib.crc32(bin_data[12:29])                 #使用函数计算
if crc32key==int(bin_data[29:33].hex(), 16):#对比算出的CRC和原本的CRC
    print('宽高没有问题')
else:
    print('宽高被改了')

爆破宽高

import binascii
import struct



crcbp = open("图片路径", "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)

站在巨人的肩膀上

你可能感兴趣的:(python)