爆破crc校驗所需要瞭解到的PNG文件頭知識
- (固定)八個字節89 50 4E 47 0D 0A 1A 0A爲png的文件頭
- (固定)四個字節00 00 00 0D(即爲十進制的13)代表數據塊的長度爲13
- (固定)四個字節49 48 44 52(即爲ASCII碼的IHDR)是文件頭數據塊的標示(IDCH)
- (可變)13位數據塊(IHDR)
- 前四個字節代表該圖片的寬
- 後四個字節代表該圖片的高
- 後五個字節依次爲:
Bit depth、ColorType、Compression method、Filter method、Interlace method
- (可變)剩餘四字節爲該png的CRC檢驗碼,由從IDCH到IHDR的十七位字節進行crc計算得到。
例題:
WDCTF-FINALS-2017¶
觀察文件可以發現,文件頭及寬度異常
00000000 80 59 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.YNG........IHDR| 00000010 00 00 00 00 00 00 02 f8 08 06 00 00 00 93 2f 8a |............../.| 00000020 6b 00 00 00 04 67 41 4d 41 00 00 9c 40 20 0d e4 |k....gAMA...@ ..| 00000030 cb 00 00 00 20 63 48 52 4d 00 00 87 0f 00 00 8c |.... cHRM.......| 00000040 0f 00 00 fd 52 00 00 81 40 00 00 7d 79 00 00 e9 |....R...@..}y...| ...
這裏需要注意的是,文件寬度不能任意修改,需要根據 IHDR 塊的 CRC 值爆破得到寬度,否則圖片顯示錯誤不能得到 flag。
import os import binascii import struct misc = open("misc4.png","rb").read() for i in range(1024): data = misc[12:16] + struct.pack('>i',i)+ misc[20:29] crc32 = binascii.crc32(data) & 0xffffffff if crc32 == 0x932f8a6b://CRS校驗 print i
得到寬度值爲 709 後,恢復圖片得到 flag。
2、寬度問題
圖片地址:
題目鏈接:http://pan.baidu.com/s/1qY8sxZI 密碼:5xam
圖片尺寸爲500x420(寬x高)
00 00 00 0D 說明IHDR頭塊長爲13
49 48 44 52 IHDR標識
00 00 01 F4 圖像的寬,500像素
00 00 01 A4 圖像的高,420像素
最後四位CB D6 DF 8 A爲CRC校驗
將圖片的高改爲500像素就拿到flag了