BugKu CTF(雜項篇MISC)—隐寫
文章目錄
- BugKu CTF(雜項篇MISC)—隐寫
-
- 隐寫
- 一、工具
- 二、解題思路
- 三、總結
隐寫
下載下傳壓縮包,解壓之後是一張圖檔,顯示BugKu。

一、工具
十六進制工具 010 editor 或notepad++
圖檔檢視器 tweakpng
二、解題思路
1.先看看圖檔屬性,啥也沒發現。
2.用010 editor編輯器打開檔案,看看檔案頭、檔案尾有什麼特殊的東西沒有。檔案頭和檔案尾都正常。
3.仔細觀察010 editor編輯器下方輸出位置,有報錯。*ERROR: CRC Mismatch @ chunk[0]; in data: cbd6df8a; expected: c758d77d
CRC報錯一般有幾種情況,一是确實是CRC被故意篡改了,可以用010改回去。
二是圖檔的高度或寬度被更改了,需要把高度、寬度改回去。一般考點都是改高度,隻要把高度改大,或者改的和寬度一樣就可以了。
4.這道題我們分别試一下改CRC值和高度,先改CRC值。可以使用010的替換功能。
改完之後發現圖檔沒什麼變化。
5.然後把CRC改回去,再改下高度試試。改完高度會發現圖檔下方出現flag。
6.我們除了可以用010 editor編輯器檢視圖檔外,還可以用tweakpng工具檢視圖檔的CRC是否有問題。
三、總結
剛接觸CTF的小夥伴肯定會問,你怎麼知道檔案裡哪個位元組表示高度、寬度,哪個位元組表示CRC了?
補充知識
一個必須由文PNG圖檔件辨別頭和三個關鍵資料塊IHDR,IDAT,IEND組成。一個PNG檔案的辨別頭為89 50 4E 47 0D 0A 1A 0A。IHDR資料塊主要描述影像的次元、色彩深度、色彩格式、壓縮類型等。IDAT資料塊主要用來存儲影像的像素資料。IEND資料塊用來标記PNG資料流結束。)
分析:在這個PNG圖檔中:
如下标紅的為PNG檔案辨別頭:
看如下圖檔:綠色的辨別顯示IHDR,這就是描述該檔案屬性的起始位置。根據定義格式,接下來的值代表圖檔的width(寬,占用4位元組),Height(高,占用4位元組),bit Depth(圖像深度,占用1位元組),Color Type(顔色類型,占用1位元組),Compression method(壓縮方法,占用1位元組),Filter Method(過濾器方法,占用1位元組),Interlace method(隔行掃描方法,占用1位元組)。根據以上内容,我們看到第二行的“00 00 01 F4“,通過程式電腦發現他的十進制值是500,說明該圖檔寬500像素,0000014A(HEX)=420(DEC)說明該圖檔高420像素。接下來藍色下劃線“08 06 00 00 00”這5個位元組分别代表上述其他屬性。緊接着後續黃色下劃線的4個位元組是CRC校驗值“CB D6 DF8A“。這裡又有一個關鍵知識點,這裡使用的是CRC-32位備援校驗。
那麼我們此時可以看看以上校驗的值是否準确。通過CRC線上計算(連接配接位址:http://www.ip33.com/crc.html),如圖所示:注意标紅處的選擇是CRC32位備援計算。
我們可以發現計算出來的CRC校驗值為:C758D77D。和圖檔裡本身的CRC校驗值“CBD6DF8A “不否。那麼問題則出現在IHDR資料庫這一部分。那麼這麼多位的值我們怎麼去判定到底是哪一位出了問題呢?此時可以根據實體像素尺寸資料塊資料來檢視,即pHYs。我們看如下圖所示:第一處标紅的”00 00 00 09“為實體像素尺寸資料塊的長度。第二處标紅的”70 48 59 73“為資料塊類型标志,對應的ASCII碼值等于pHYs。接下來藍色的部分表示x軸上每米像素數量00001274和y軸上每米像素數量00001274(解題關鍵點)。綠色的”01“表示meter=1,機關定義為”每米“的意思,後面的綠色辨別為CRC值。
我們發現x軸和y軸的像素應該是一樣的,換句話說,這個圖檔的比例應該是正方形。此時我們把上述的高420像素值改為500。即”A4“改為”F4“,再次檢視圖檔,找到flag。
最後檔案的尾部特征塊IEDN如圖所示:
如下标紅的為資料流結束辨別,固定為49 45 4E 44。後面的AE 42 60 82為CRC校驗碼。
以上除了IHDR和IEND資料塊外,中間的部分就是IDAT資料塊。
文章部分内容來自FreeBuf.COM