在上集 Day 09 中,我們學習了如何透過 file 檢查 Magic Bytes 與使用 exiftool 尋找藏在 Metadata 中的秘密。但如果出題者把 Flag 或另一個壓縮檔直接「嵌入」到圖片的像素或檔案尾端,表面上看起來只是一張普通照片,這時該怎麼辦呢?
這就是 Steganography(隱寫術) 的領域!隱寫術的精髓在於「隱藏資訊的存在本身」。今天我們將探討隱寫術的核心技術原理,並學習如何使用 Linux 鑑識工具把隱藏在裡面的檔案一層層剝出來。
透過概念解析與工具操作,掌握以下 Steganography 核心技能:
binwalk、zsteg 與 steghide 等數位鑑識工具的使用。FF D9 或 PNG 的 IEND)有明確的結束標記(EOF)。作業系統的圖片檢視器讀到結束標記後就會停止讀取,但如果我們在結束標記後面附加一個 .zip 檔,圖片依然能正常開啟,而附加的檔案則隱藏在資料尾端!binwalk 掃描,或用 foremost 進行檔案切開(Carving)。zsteg 或 StegSolve 工具進行分析。steghide 工具,並搭配正確的 Passphrase(或爆破密碼)才能解出。| 工具名稱 | 適用檔案類型 | 核心功能與常用指令 |
|---|---|---|
binwalk |
所有檔案 | 掃描檔案內是否嵌入其他檔案:binwalk target.png自動萃取嵌入檔:binwalk -e target.png |
zsteg |
PNG / BMP | 檢測 LSB 隱寫與隱藏通道:zsteg -a target.png |
steghide |
JPEG / WAV / BMP | 萃取密碼保護的隱寫檔案:steghide extract -sf target.jpg |
strings |
所有檔案 | 快速搜尋檔案中的可讀字串:strings target.jpg | grep -i "pico" |
dolls.jpg,提示我們照片內部可能層層嵌套了其他檔案。
在 WSL 環境中使用 file 與 binwalk 確認 dolls.jpg 的真實內容:
file dolls.jpg
# 輸出:dolls.jpg: PNG image data, 594 x 1104, 8-bit/color RGBA
binwalk dolls.jpg
** 掃描結果:**
在位址272492 (0x4286C)發現了Zip archive data,內部包含 base_images/2_c.jpg!
由於這題構造如同「俄羅斯套娃」,我們必須重複執行binwalk -e萃取與unzip解壓縮:
** 第一層萃取 (dolls.jpg → 2_c.jpg):**
binwalk -e dolls.jpg
cd _dolls.jpg.extracted
unzip 4286C.zip

** 二層萃取 (2_c.jpg → 3_c.jpg):**
binwalk -e base_images/2_c.jpg
cd base_images/_2_c.jpg.extracted
unzip 2DD3B.zip

第三層萃取 (3_c.jpg → 4_c.jpg):
binwalk -e base_images/3_c.jpg
cd base_images/_3_c.jpg.extracted
unzip 1E2D6.zip

第四層萃取 (4_c.jpg → flag.txt):
binwalk -e base_images/4_c.jpg
cd base_images/_4_c.jpg.extracted
unzip *.zip
進到最內層資料夾後,讀取flag.txt:
cat flag.txt
Flag 輸出:picoCTF{LL9lb1dR4QbGe4l4iWCvGq9pdtwt7392}