在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进制转文本: