ctf-misc PNG(文件頭IHEDR)圖片隱寫

爆破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了








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章