返回顶部
首页 > 资讯 > 后端开发 > Python >CRC爆破png图片宽度和高度原理以及python代码
  • 346
分享到

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

开发语言python 2023-09-16 16:09:58 346人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

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


文章目录


1.PNG图片的格式

在这里插入图片描述

(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数值无误!


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 zlibimport structimport argparseimport itertoolsparser = 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]) # 计算crcoriginal_crc32 = int(bin_data[29:33].hex(), 16) # 原始crcif 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

来源地址:https://blog.csdn.net/qq_47875210/article/details/126171502

--结束END--

本文标题: CRC爆破png图片宽度和高度原理以及python代码

本文链接: https://lsjlt.com/news/410095.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作