CRC爆破png图片宽度和高度原理以及python代码

CRC爆破png图片宽度和高度原理以及python代码


文章目录

  • CRC爆破png图片宽度和高度原理以及python代码
    • 1.PNG图片的格式
    • 2.CRC
    • 3.Python爆破图片宽度和高度
    • 参考文章:


1.PNG图片的格式

CRC爆破png图片宽度和高度原理以及python代码_第1张图片

(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爆破png图片宽度和高度原理以及python代码_第2张图片

在线CRC计算网站

根据49 48 44 52 00 00 01 FF 00 00 01 FF 08 06 00 00 00 成功计算出来了CRC的数值:59 F1 D4 BE,和图片中的CRC数值无误!


2.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数值。


3.Python爆破图片宽度和高度

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)

运行效果:

CRC爆破png图片宽度和高度原理以及python代码_第3张图片



参考文章:

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

你可能感兴趣的:(开发语言,python)