【攻防世界】 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}