【攻防世界】 2-1

⭕、知识点
png图片文件格式以及CRC宽度爆破、struct模块使用

一、题目
给了一张无法打开的图片

二、解题
1、文件编辑器查看发现文件头,修改为8950后仍然打不开
2、观察后续的文件内容,文件文件数据头尾均正常
3、再仔细看发现宽度为0,初步确认需要使用宽度爆破
4、编写脚本

import struct
import binascii

with open("1.png", "rb") as f:
    data = f.read()
# 读取图片CRC值
realCrc = int.from_bytes(data[29:33], byteorder='big')

print(realCrc)
'''
2469366379
'''

print(hex(realCrc))
'''
0x932f8a6b
'''

# 宽度爆破
for i in range(0, 0x00010000):
    c = data[12:16] + struct.pack(">i", i) + data[20:29]
    crc = binascii.crc32(c) & 0xffffffff
    if crc == realCrc:
        print(i)
        print(hex(i))
'''
709
0x2c5
'''

解释:
1、一般图片宽度不会超过10000
2、文件读取到的为二进制数据,要把二进制数据转为整形表示需要使用int.from_bytes()方法
3、png图片采用crc32进行校验
4、默认采用大端数据存储(高位字节存储在低地址区)

5、修改宽度

6、打开图片

三、答案
wdflag{Png_C2c_u_kn0W}

posted @ 2025-04-01 22:30  wyuu101  阅读(41)  评论(0)    收藏  举报