[CTF-MISC][图片隐写]如何判断图片被修改了宽高

图片修改宽高判断

图片隐写题中修改图片的宽高是非常常用手段之一,如何快速判断图片修改了宽高呢?

  1. 使用windows查看图片属性,会发现属性里的高度和16进制软件(010Editor、winhex、hxd)里提供的高宽数据不一样,这时候就可以怀疑宽高被修改了。
    注:有的时候是一致的,所以一致不代表没被修改

  2. 图片放入010Editor,自动载入自带的Template,左下角会提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错。
    看到这样的提示,说明图片高宽很可能被修改过。
    [CTF-MISC][图片隐写]如何判断图片被修改了宽高

  3. pngcheck、tweakpng检查图片会发现,都会提示CRC校验错误。
    [CTF-MISC][图片隐写]如何判断图片被修改了宽高
    [CTF-MISC][图片隐写]如何判断图片被修改了宽高

  4. 修改高或者宽,再查看图片会发现图片变乱了,无法正常显示,这说明这个高或者宽不能修改了,如果能正常显示,说明宽高被修改了,只管往大了修。
    [CTF-MISC][图片隐写]如何判断图片被修改了宽高


常见题型的处理

  1. 修改宽高,直接就可以看到flag,这里不需要做其他工作。
  2. 修改宽高,并不会直接看到flag,需要放入stegsolve里或者做其它的进一步处理。
    这里会产生一个问题,那就是修改过宽高的图片stegsolve无法打开,提示IO错误。
    这是因为png图像的IHDR段中的高宽被修改,导致计算出来的CRC不正确,所以无法正确读取。
    这里有两种办法进行处理:
#!/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下对修改后的图片,右键点击编辑,然后再保存就可以了。
上一篇:关于CRC的一些练习


下一篇:第三周——上课笔记(一)