(1). png的文件头:8个字节 89 50 4E 47 0D 0A 1A 0A
为 png的文件头(固定)
(2). 4个字节 00 00 00 0D
十进制为13,代表头部数据块的长度为13
(3). 4个字节 49 48 44 52
ASCII码为IHDR,表明数据块为IHDR
(4). 13位数据块(IHDR)(红色线条部分)
前四个字节代表该图片的宽 00 00 01 FF
(不固定,可变)
后四个字节代表该图片的高 00 00 01 FF
(不固定,可变)
后五个字节依次为: Bit depth、ColorType、 Compression method、 Filter method、Interlace method(不固定,可变)
(5). 剩余四字节为该png的CRC检验码 59 F1 D4 BE
,由从IDCH到THDR的十七位字节进行crc计算得到。(黄色线条的部分)
可以使用网站手动验证一下CRC:
在线CRC计算网站
根据49 48 44 52 00 00 01 FF 00 00 01 FF 08 06 00 00 00
成功计算出来了CRC的数值:59 F1 D4 BE
,和图片中的CRC数值无误!
影响上图的CRC的有49 48 44 52 00 00 01 FF 00 00 01 FF 08 06 00 00 00
49 48 44 52
ASCII码为IHDR,表明数据块为IHDR
00 00 01 FF
图片的宽
00 00 01 FF
图片的高
08 06 00 00 00
五个字节依次为: Bit depth、ColorType、 Compression method、 Filter method、Interlace method
一般不会考虑最后5个字节的变化,所以可以根据CRC来爆破图片的宽度和高度。因为除了图片宽度和图片高度,再加上忽略的最后5字节,其他的都是固定的,所以只有图片宽度和高度会影响CRC数值。
import zlib
import struct
import argparse
import itertools
parser = argparse.ArgumentParser()
parser.add_argument("-f", type=str, default=None, required=True,
help="输入同级目录下图片的名称")
args = parser.parse_args()
bin_data = open(args.f, 'rb').read()
crc32key = zlib.crc32(bin_data[12:29]) # 计算crc
original_crc32 = int(bin_data[29:33].hex(), 16) # 原始crc
if crc32key == original_crc32: # 计算crc对比原始crc
print('宽高没有问题!')
else:
input_ = input("宽高被改了, 是否CRC爆破宽高? (Y/n):")
if input_ not in ["Y", "y", ""]:
exit()
else:
for i, j in itertools.product(range(4095), range(4095)): # 理论上0x FF FF FF FF,但考虑到屏幕实际/cpu,0x 0F FF就差不多了,也就是4095宽度和高度
data = bin_data[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + bin_data[24:29]
crc32 = zlib.crc32(data)
if(crc32 == original_crc32): # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
print(f"\nCRC32: {hex(original_crc32)}")
print(f"宽度: {i}, hex: {hex(i)}")
print(f"高度: {j}, hex: {hex(j)}")
exit(0)
运行效果:
struct.pack: https://blog.csdn.net/u012842630/article/details/85726870
png宽高被改,crc无脑爆破: https://blog.csdn.net/qq_61554462/article/details/123599109
png图片CRC爆破原理的学习: https://www.cnblogs.com/yunqian2017/p/14449346.html
CTF-bugku-misc-[隐写3]-png高度隐写和pngCRC校验: https://blog.csdn.net/m0_43405474/article/details/123361993
PNG格式的数据结构: https://blog.csdn.net/weixin_44949552/article/details/105231309