在Linux中打开图片(windows下可以打开图片,其他系统下不能打开图片可以判断为crc校验码错误):

出现CRC错误有两种可能性:宽高不正确,CRC正确,修复宽高;宽高正确,CRC不正确,修复CRC;

用16进制编辑器打开图片:

89 50 4E 47 0D 0A 1A 0A为png的文件头;

00 00 00 0D转换为十进制为13(即代表数据块的长度为13),数据块包含png图片的宽高等信息;

49 48 44 52(ASCII码的IHDR)表示文件头数据块的标示;

00 00 01 2D 00 00 01 4F 08 02 00 00 00为13位数据块的内容,其中00 00 01 2D为png的宽,00 00 01 4F为png的高;

接下来的四位66 6C 61 67为png的CRC校验码,是由IDCH以及13位数据块计算得到的。

可以发现flag出现,且为CRC校验码,猜测CRC校验码是正确的:

爆破图片修改前的宽高匹配校验码:

import zlib
import struct
crc32key = 0x666c6167
data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\x2D\x00\x00\x01\x4F\x08\x02\x00\x00\x00')
n = 65535
for w in range(n):
    width = bytearray(struct.pack('>i',w))
    for h in range(n):
        height = bytearray(struct.pack('>i',h))
        for x in range(4):
            data[x+4] = width[x]
            data[x+8] = height[x]

        crc32result = zlib.crc32(data)
        if crc32result == crc32key:
            print(width,height)

得到宽高没有显示flag,怀疑这不是真的CRC,放进stegsolve中分析:

由Calculate CRC得知,CRC是不正确的,那么推测错误的CRC中隐藏着信息,将所有错误的CRC连接起来,16进制转文本:

02-10 08:49