图片修改宽高判断
图片隐写题中修改图片的宽高是非常常用手段之一,如何快速判断图片修改了宽高呢?
-
使用windows查看图片属性,会发现属性里的高度和16进制软件(010Editor、winhex、hxd)里提供的高宽数据不一样,这时候就可以怀疑宽高被修改了。
注:有的时候是一致的,所以一致不代表没被修改 -
图片放入010Editor,自动载入自带的Template,左下角会提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错。
看到这样的提示,说明图片高宽很可能被修改过。 -
pngcheck、tweakpng检查图片会发现,都会提示CRC校验错误。
-
修改高或者宽,再查看图片会发现图片变乱了,无法正常显示,这说明这个高或者宽不能修改了,如果能正常显示,说明宽高被修改了,只管往大了修。
常见题型的处理
- 修改宽高,直接就可以看到flag,这里不需要做其他工作。
- 修改宽高,并不会直接看到flag,需要放入stegsolve里或者做其它的进一步处理。
这里会产生一个问题,那就是修改过宽高的图片stegsolve无法打开,提示IO错误。
这是因为png图像的IHDR段中的高宽被修改,导致计算出来的CRC不正确,所以无法正确读取。
这里有两种办法进行处理:
- 使用脚本进行爆破,通过暴力破解的方式,爆破出被修改的宽高
png中CRC检验错误的分析
安恒2019-07 真正的CTFer里的脚本
这里直接引用别人所写的脚本,python2运行。
通过碰撞的方法,计算出真实的宽高,再将图片的宽高修改为真实宽高。
#!/usr/bin/env python
# encoding: utf-8
# -*- coding: utf-8 -*-
import binascii
import struct
#这段数据就是png图中IHDR段的16进制数据,不包括开始的length和最后CRC
#\x49\x48\x44\x52\x00\x00\x05\x1C\x00\x00\x05\x00\x08\x06\x00\x00\x00
#其中\x00\x00\x05\x1C表示宽度,\x00\x00\x05\x00表示高度
crc32key = 0x6F03AD71#IHDR段中CRC值
for i in range(0, 65535):
height = struct.pack('>i', i)#将整数转化成16进制
#compute height
data = '\x49\x48\x44\x52\x00\x00\x05\x1c'+height+'\x08\x06\x00\x00\x00'
#compute width
#data = '\x49\x48\x44\x52'+height+'\x00\x00\x09\xe4\x08\x06\x00\x00\x00'
crc32result = binascii.crc32(data) & 0xffffffff
if crc32result == crc32key:
print ''.join(map(lambda c: "%02X" % ord(c), height))
- 第二个方法更简单,在windows下对修改后的图片,右键点击编辑,然后再保存就可以了。