在CTF比賽中,misc方向是必考的一個方向,其中,圖形隱寫是最最常見的類型。
先從Misc開始入門,一般會借助CTF SHOW解題平臺,解題,然后進行技巧總結。
目錄
圖片篇(基礎操作)
misc1
misc2
misc3
misc4
圖片篇(信息附加)
misc5
misc6
?misc7
misc8
misc9
misc10?
misc11
misc12
?misc13
misc14
msic15
misc16
misc17
misc18
misc19
misc20
?misc21
misc22
misc23
misc41
總結
文件偽裝
文件附加數據
文件拼接
元數據隱寫
編碼轉換隱寫
圖片篇(基礎操作)
misc1
jie直接下載文件解壓后打開圖片就能看到flag。
misc2
解壓文件打開misc2.txt,發現文件頭格式
可以知道這是一個png文件,所以講文件擴展名改為png就可以查看到flag。
misc3
解壓文件,發現一個后綴為.bpg的文件,查看文件
發現文件頭格式已經和文件后綴相對應,那么可以去尋找支持查看bpg圖片的軟件,例如BandiView或者Honeyview。
misc4
解壓文件,發現六個文本文件,還是開始查看文件格式和后綴是否相對應:
可以看到每個文件的格式都不太一樣,只需要將每個文件后綴名改成相對應的就能夠查看到了。
圖片篇(信息附加)
misc5
只有一個圖片,顯示:
那么還是照樣查看這個文件的內容,發現在文件最后藏有flag
misc6
同樣的,這里只有一張圖片,打開也沒有flag
cat查看這個文件的內容,先查看屬性和后綴名有沒有問題,大小有沒有問題,這里都沒有,那我們要去看看文件內容能不能發現什么。
發現內容太多,沒有辦法有效地查看內容,那我們可以利用grep命令查看是否包含有關“ctf”或者“flag”關鍵詞的內容
-a:將二進制文件(比如jpg文件)當作文本文件處理,避免grep跳過二進制文件
-F:將搜索詞當作固定字符串(非正則表達式)
當然,在Windows系統直接使用文件編輯器打開Ctrl+F搜索內容
?misc7
跟misc6一樣,過程都要來一遍,不要閑麻煩
misc8
解壓后文件和上面的普通一樣,一步步嘗試下來,沒有發現內容還有后綴名等有什么問題,這里要新認識到一個圖片里面存在多個文件的解法。
這里是屬于文件直接拼接(還有其他的隱藏方式后面應該會講),將其他文件直接追加到圖片的尾部,圖片查看器會忽略多余數據,但工具可以提取。
接下來使用binwalk工具來分析是否包含多個文件
很明顯,這里包含了兩個圖片文件,接下來嘗試用binwalk工具進行分離
分解出一個_misc8.png.extracted文件夾,查看發現不是想要的
那么再使用foremost工具進行分解文件
生成一個output文件夾,但是打開這個output文件夾是沒有發現文件的
這是因為生成的文件kali沒有執行權限
?那我們修改這個文件以及其子文件的權限
-R 用于遞歸地更改文件和目錄的權限
權限通過八進制數字表示:4=讀 (r),2=寫 (w),1=執行 (x)
打開文件就看到flag了。
binwalk是基于文件頭/尾簽名進行掃描,它的處理文件能力比較弱,適用于快速檢測是否存在內嵌文件
foremost是基于文件頭和文件結構進行深度分析,處理分解能力強,適用于文件損壞或者碎片化時候,在binwalk分解失敗時使用
misc9
跟misc6一樣
misc10?
跟misc8一樣,使用binwalk檢測內嵌文件并嘗試分解,如果不行使用foremost進行分解,這里使用binwalk就可以分解成功了
misc11
前面跟misc9一樣,先查看文件頭沒有問題,并且文件內容搜索不到flag,然后使用binwalk分析文件是否存在多個文件,這里出現了多個文件
然后使用binwalk分解,binwalk分解不行,再利用foremost進行分解,這里使用foremost分解最終得到一張圖片,圖片還不在這里
根據題目給的提示“flag在另一張圖里” ,使用tweakpng刪除第一個IDAT,保存得到一個新圖片(tweakpng是一個Windows工具,也可以通過wine在kali運行,可以嘗試)
得到的新圖片就有flag?
PNG的圖像數據塊(IDAT)存儲圖像的實際數據,可以包含多幅圖像,所以一張圖片可能有多個圖像的數據組成,但默認顯示第一個IDAT數據塊圖像。
misc12
前面步驟省略...
這里用binwalk分析是否存在內嵌文件,沒有
接著使用tweakpng,能夠看到很多個IDAT數據塊
然后這里就有兩個思路:
1. 將所有IDAT數據塊合并查看,還可以再進一步使用binwalk和foremost進行分解圖片查看是否能夠得到有效的圖片
2. 手動一個個IDAT數據塊得到每一個圖片是否是有效圖片
先來合并IDAT數據塊
分別使用binwalk和foremost工具生成的文件都沒有想要的文件
?那一個個刪除IDAT文件看看,刪除了前面八個就能夠得到flag了(記得每一個刪完都要save!!!)
?misc13
按照前面題目的流程可以過一遍,沒有得到想要的文件。
根據題目提示flag位置在圖片末尾,說明應該還是藏在圖片的內容中,使用grep查詢包含'c'的片段,發現有一個很疑似flag的片段
這里的規律是隔位取值(其實單看ctfshow還是勉強能看得出來這個規律的),得到四個flag
ctfshow{ae6e3fa48f528b1742d72e6f41298380}
ctfshow{1e3e2ed48f518b7e4267de1c412a839a}
ctfshow{ae6e3ea48f518b7e42d7de6f412f839a}
ctfshow{ae6e46c48f739b7eb2d1de6e412f839a}
都試試哪一個是答案flag就好了
misc14
按照步驟,發現圖片內嵌著多個文件
然后進行binwalk分解,出現報錯,并且foremost提取出來的文件也不是想要的
這里報錯的原因有可能是文件結構異常(可能被加密之類的情況)或者是簽名數據庫識別不出
可以利用dd手動提取隱藏文件
那么我們需要提取的是后面那個圖片文件,偏移量為2103
得到的jpg文件就是flag
也可以使用-D命令
文件頭是JPEG文件
msic15
這里就是根據上面的方法,在使用vim或者Windows文本編輯器查看文件內容時,能夠在文件頭看到flag
題目這里給了提示:flag跳過去了,這個'跳'字?
?BMP格式的文件頭里有4位字節稱作偏移量,用來指圖像數據的起始位置。
題目就是利用增大這個偏移量的方法,把冗余數據塞在了BMP頭部,之后的內容可以正常顯示。
當使用cat的時候是不能顯示出tfshow{...}這部分的,如果flag被塞在了文件頭和信息頭之后、圖像數據之前,這段數據可能包含空字符(或者是非ASCII字符),當cat遇到空字符會提前終止輸出而不會輸出后面這段內容(遇到非ASCII會顯示亂碼,掩蓋flag)但是vim以及Windows的文本編輯器就不會,因為是強制顯示所有字節的(包括空字符和非ASCII字符)
misc16
使用binwalk判斷是否存在多個文件,顯示存在,然后使用binwalk進行分解
?打開DD4文件就能看到flag
misc17
使用binwalk發現存在多個文件
使用binwalk分解出的文件也沒有得到想要的?
使用forest工具分解也沒有得到想要的
使用tweakpng一個個刪除以及合并IDAT,也沒有效果
題目提示是“答案藏在內容中”,查閱,這里需要用到zsteg工具
?zsteg是一個專門用于檢測PNG和BMP圖像中隱寫數據的工具,支持LSB(最低有效位)、文件附加數據、異常調色板等常見隱寫手法。kali工具下載就好gem install zsteg
?發現這里有隱藏的額外數據“extradata:0”,“3544 bytes of extra data after zlib stream
”表明 PNG 文件的 IDAT 數據塊(存儲圖像壓縮數據的部分)之后存在額外的隱藏數據
將額外的數據保存到一個文件
再次使用binwalk分解額外數據文件
得到的圖片即是flag
附加文件需要完整的文件頭+文件體才能被解壓工具識別,直接使用binwalk提取時,如果數據未完整分離,zip工具會出現報錯。
misc18
注意這里有一個不同尋常的提示“flag在標題、作者、照相機和鏡頭型號里”。
查看圖片的屬性
?
misc19
這里提示“flag在主機上的文檔名里”,但在普通查看屬性看不到信息,這里可以使用exiftool工具查看完整的Exif元數據
?當然也可以使用Exif官方網站查看信息https://exif.tuchong.com/
元數據是“描述數據的數據”,即文件的附加信息,用于記錄文件的屬性、來源、編輯歷史等,但不會直接影響文件的主要內容。在CTF中,元數據常被用來隱藏Flag或者傳遞線索,因為它容易被忽視,但又支持自定義寫入。?
misc20
這里提示“flag在評論里”,跟misc18一樣使用exiftool查看文件附加信息,發現comment有flag
?翻譯過來,flag為ctfshow{c9796b1aecf06e1d79c21ddad593e42}
?misc21
這里提示“flag在序號里”,跟上面一樣使用exiftool查看文件的序號,發現一行數字
剛開始沒有什么思路,查閱,這里需要16進制轉換
1. 數字由0-9數字組成,并且位數為偶數,符合十六進制字節對的特征
2. CTF經常使用十六進制編碼隱藏ASCI字符
轉換出來的字符串是hex十六進制轉換函數,將X和Y進行hex轉換,那這里有分辨率和位置的X和Y
分別轉換得到的flag為ctfshow{e8a221498d5c073b4084eb51b1a1686d}
misc22
開始注意到沒點開之前的圖片是有黃色字符的,但點開就看不到了。這里binwalk檢測出有兩個圖片
使用binwalk和foremost工具都分解不出所要的,考慮使用手動分解
FFD8文件開始位置,FFD9文件結束位置
這邊binwalk和foremost分解不出來的原因有可能是第一個文件的結束標記后面緊接了數據塊,JPEG 文件允許
FF D9
出現在注釋或數據段中(非實際結束),工具可能被誤導,從而解析不出。
這里的第二個文件偏移量計算:0xA0十六進制為160,注意這是行的起始位置,要加上后面的14個字節,所以偏移量為174
這里文件分解出來就能夠看到黃色部分
Windows也可以使用winhex,這是一個非常厲害且好用的工具
打開winhex搜索FFD8
將第二個FFD8之前的內容Ctrl選中刪除生成一個新的文件
保存就可以看到黃色字體了。
另外,這里沒有打開之前能看到黃色字體,但打開之后看不到,這種稱作thumbnail隱寫(縮略圖隱寫)
縮略圖是一個小型的JPEG,有獨立的文件頭標記和文件結束標記
縮略圖僅在文件預覽時顯示,打開不顯示
對于這個隱寫,可以直接使用exiftool工具進行提取
exiftool -ThumbnailImage -b misc22.jpg > thumb.jpg
misc23
題目提示“flag在時間里”,exiftool工具查看
“history action”字段翻譯為“時間戳,十進制轉十六進制,得到flag”
首先先將時間轉為時間戳https://tool.lu/timestamp/(注意格式)
然后將時間戳轉換為16進制
最終得到的flag
ctfshow{3425649ea0e31938808c0de51b70ce6a}
misc41
題目提示:“H4ppy Apr1l F001's D4y!
愚人節到了,一群笨蛋往南飛,一會兒排成S字,一會兒排成B字。”
根據提示,可以猜測解題關于“F001”這串字符有關,在圖片內容搜索
高亮部分圖案就是flag(雖然我沒看出來、、、)
flag為ctfshow{fcbd427caf4a52f1147ab44346cd1cdd}
總結
內容比較多,先針對圖片篇的基礎操作和信息附加進行總結
文件偽裝
這對應的是后綴名和文件格式不對應,誘導選手用錯誤工具打開
如何檢測?
- file flag.jpg 查看真實文件類型
文件附加數據
這對應的是圖片末尾插入flag明文以及BMP文件頭和內容中間插入flag明文
原理:
- 能夠直接插入圖片明文是因為,圖片解析過程中碰到不能解析的內容會直接跳過,不影響圖片顯示
- 能夠在BMP文件里面插入flag是因為,BMP文件的偏移量決定圖像數據的起始位置,如果人為增大偏移量可以在文件頭和圖像數據之間插入額外數據
如何檢測?
-
grep -a? -F 'ctf' misc17.png 查看明文字符串(未隱藏)
-
vim 查看文件所有內容(文本編輯器也可以)
文件拼接
這對應的是binwalk發現圖片包含多個文件
如何檢測?
- 自動分離文件:使用binwalk和foremost深度掃描,foremost比binwalk厲害,binwalk這里也需要注意-e和-D命令的區別
- 手動提取:使用dd命令或者WinHex工具進行手動提取,dd命令需要準確知道文件的偏移量,WinHex是可視化工具,相對操作比較簡單,而且功能比較全面
- 縮略圖可以使用exiftool工具直接提取
元數據隱寫
這對于的是將flag隱藏在文件的屬性信息(如標題、作者等)中
如何檢測?
- 可以直接通過文件屬性查看工具exiftool查看,或者使用Exif網頁版
- 縮略圖用
exiftool -ThumbnailImage提取
編碼轉換隱寫
這里對應的是Flag經過某種編碼或加密后存儲,需按提示轉換(如Hex→ASCII、時間戳→日期、Base64解碼等)
如何檢測?
- 直接使用對應進制轉換網頁版
根據上面總結需學會系統解題。
接下來會進行misc入門的圖片篇(文件結構)及(顏色通道)進行學習。