CTF系列——Misc之PNG的CRC32校验

CTF系列——Misc之PNG的CRC32校验

参考资料:https://wiki.x10sec.org/misc/picture/png/

题目是一张名为crc.png的PNG图片,在windows下并不能正常打开,怀疑是该PNG的宽度、高度被修改,导致CRC校验未通过。

使用010Editor打开该图片,看到如下信息:

Hex信息

  • 前八个字节89 50 4E 47 0D 0A 1A 0A是PNG格式固定的文件头;
  • 00 00 00 0D代表图片长宽的数据块长度为13,也是固定值;
  • 第一个方框中49 48 44 52代表IHDR,固定值;
  • 第二行开始的00 00 01 00为图片宽度,00 00 00 00为图片高度;
  • 由于数据块长度为13,所以08 02 00 00 00为剩余部分;
  • 12 9C B6 9B为CRC32校验和。

正常情况下,windows系统的图片查看器是可以忽略CRC校验失败而直接打开图片的,但由于这张图片的高度是0,所以,,无论如何也不能正常打开。而Linux下不可以直接打开CRC校验失败的图片。

先将高度改为01 00试试:

。。。

这辣眼睛的色彩。。。看起来是不对的

参考网络上的相关资料,需要考虑爆破CRC校验,所以上python

版本一

1
import binascii
2
import struct
3
4
# \x49\x48\x44\x52\x00\x00\x01\x00\x00\x00\x00\x00\x08\x02\x00\x00\x00
5
crc32key = 0x129CB69B
6
7
for i in range(0, 65535):
8
    for j in range(0, 65535):
9
        width = struct.pack('>i', j)
10
        height = struct.pack('>i', i)
11
        data = b'\x49\x48\x44\x52' + width + height + b'\x08\x02\x00\x00\x00'
12
        crc32result = binascii.crc32(data) & 0xffffffff
13
        if crc32result == crc32key:
14
            print(''.join(map(lambda c: "%02X" % c, width)))
15
            print(''.join(map(lambda c: "%02X" % c, height)))

该版本在python 3.8运行通过。

得到答案如下:

width x height

将图片的宽度和高度修改为以上结果,可以还原初始图片

answer

版本二

该代码来源于CTFwiki官方:

1
import os
2
import binascii
3
import struct
4
5
6
misc = open("此处选择图片","rb").read()
7
8
for i in range(1024):
9
    data = misc[12:16] + struct.pack('>i',i)+ misc[20:29]
10
    crc32 = binascii.crc32(data) & 0xffffffff
11
    if crc32 == "此处填写CRC校验和":
12
        print i

声明:该代码未经测试,且对于此题需要同时爆破高度和宽度,这里只给出一个维度的循环,需仿照上面的代码进行修改。(嘛,懒得再测试一遍了,反正结果一样~

总结:以前的CRC经常是给出宽度或者高度,另一个值需要自己破解,但是这次居然同时需要两个值,算是一个小坑吧(我太菜了,逃

特别鸣谢:手动@谢大佬

# ,

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×