圖片修改寬高判斷
圖片隱寫題中修改圖片的寬高是非常常用手段之一,如何快速判斷圖片修改了寬高呢?
-
使用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下對修改后的圖片,右鍵點擊編輯,然后再保存就可以了。