下载解压题目文件,发现一张图片
用binwalk分析一下,并没有隐藏文件
查看图片详细信息,没有隐藏东西。然后看了下图片宽高(分辨率),并用winHex打开发现,高度不一致
将分辨率转换成16进制,0500应该改为0A00。高度恢复了
发现flag了
发现看不清,也可以看出。想用stegsove反色看一下,然而用stegsolve打不开修改高度后的图片。
于是百度了下原因
对一张正常的图片,通过修改其宽度或者高度隐藏信息,使计算出的CRC校验码与原图的CRC校验码不一致;windows的图片查看器会忽略错误的CRC校验码,因此会显示图片,但此时的图片已经是修改过的,所以会有显示不全或扭曲等情况,借此可以隐藏信息。
而Linux下的图片查看器不会忽略错误的CRC校验码,因此用Linux打开修改过宽或高的png图片时,会出现打不开的情况
箭头所指即为crc效验码。 可以通过爆破图片修改前的宽和高来匹配CRC校验码,并用正确的宽和高来修复图片 为了做题的方便,先尝试爆破高度,脚本如下(百度搜的,还不会写,只修改了参数): # -*- coding: utf-8 -*-
import binascii
import struct
#\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xA4\x08\x06\x00\x00\x00
crc32key = 0x6F03AD71
for i in range(0, 65535):
height = struct.pack('>i', i)
#CRC: 6F03AD71
data = '\x49\x48\x44\x52\x00\x00\x05\x1C' + height + '\x08\x06\x00\x00\x00'
crc32result = binascii.crc32(data) & 0xffffffff
if crc32result == crc32key:
print ''.join(map(lambda c: "%02X" % ord(c), height))
运行脚本,输出000009E4,即原图片高度为00 00 09 E4爆破成功
修改后,发现可以用stegsolve打开了
|