轉載自:https://www.cnblogs.com/lxz-1263030049/p/9388511.html
一直有這個想法,打算把關於misc類型的題目總結一下,希望能夠提醒自己一直學習
也希望能夠幫助到那些需要幫助的人
本文參考自:先知社區:https://xz.aliyun.com/t/1833
隱寫術介紹:
隱寫術是關於信息隱藏,即不讓計劃的接收者之外的任何人知道信息的傳遞事件(而不只是信息的內容)的一門技巧與科學。
英文寫作Steganography,而這篇內容將帶大家瞭解一下CTF賽場上常見的圖片隱寫方式,以及解決方法。有必要強調的是,隱寫術與密碼編碼是完全不同的概念。
第一部分:附加式的圖片隱寫
在附加式的圖片隱寫術中,我們通常是用某種程序或者某種方法在載體文件中直接附加上需要被隱寫的目標,
然後將載體文件直接傳輸給接受者或者發佈到網站上,然後接受者者根據方法提取出被隱寫的消息,這一個過程就是我們這裏想提到的附加式圖片隱寫。
而在CTF賽事中,關於這種圖片隱寫的大概有兩種經典方式,一是直接附加字符串,二是圖種的形式出現
實驗部分:
找到隱寫術目錄,打開圖片隱寫,打開圖片隱寫第一部分文件夾
在該文件夾找到 xscq.jpg,
雙擊打開圖片,我們先確認一下圖片內容並沒有什麼異常
正如前文所說,我們這個實驗部分講的是附加字符串的隱寫方式,所以我們用Strings檢查一下圖片
在Strings工具的搜索下,我們看到了一串base64編碼後的字符串
最終解碼後,flag:flag{welcome_to_xianzhi}
strings使用方法
strings命令在對象文件或二進制文件中查找可打印的字符串。字符串是4個或更多可打印字符的任意序列,以換行符或空字符結束。 strings命令對識別隨機對象文件很有用。
選項:
- -a --all:掃描整個文件而不是隻掃描目標文件初始化和裝載段
- -f –print-file-name:在顯示字符串前先顯示文件名
- -t --radix={o,d,x} :輸出字符的位置,基於八進制,十進制或者十六進制
- -e --encoding={s,S,b,l,B,L} :選擇字符大小和排列順序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit
Tips 我們使用strings + 文件名字的命令即可
具體步驟如下:
在cmd中打開strings工具,使用如下命令
strings ctf.jpg
得到如下字符串:ZmxhZ3t3ZWxjb21lX3RvX3hpYW56aGl9
我們嘗試用base64解碼,代碼過程如下:
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> base64.b64decode('ZmxhZ3t3ZWxjb21lX3RvX3hpYW56aGl9')
'flag{welcome_to_xianzhi}'
>>>
這裏也可以使用在線解密工具
有必要提到的是,爲什麼字符串要附加在文件的後面呢?那是因爲,如果圖片附加在中間,有可能破壞了圖片的信息,
如果字符串附加在圖片的頭部位置,又破壞了文件頭,可能導致圖片無法識別。關於文件格式的具體內容,我們下一個部分的隱寫還會提到。
第二部分:圖種形式隱寫
圖種:
一種採用特殊方式將圖片文件(如jpg格式)與rar文件結合起來的文件。該文件一般保存爲jpg格式,可以正常顯示圖片,
當有人獲取該圖片後,可以修改文件的後綴名,將圖片改爲rar壓縮文件,並得到其中的數據。
圖種這是一種以圖片文件爲載體,通常爲jpg格式的圖片,然後將zip等壓縮包文件附加在圖片文件後面。
因爲操作系統識別的過程中是,從文件頭標誌,到文件的結束標誌位,當系統識別到圖片的結束標誌位後,默認是不再繼續識別的,所以我們在通常情況下只能看到它是隻是一張圖片。
實驗部分:
在實驗機中找到隱寫術目錄,打開圖片隱寫,打開圖片隱寫第一部分文件夾
在該文件夾找到cqzb.jpg,
雙擊打開圖片,我們先確認一下圖片內容並沒有什麼異常
對圖片進行檢測,確認是不是圖種
使用winhex打開圖片,並分離圖片,得到一個壓縮包
打開壓縮包得到flag,flag:flag{This is easy}
在linux中是binwalkk命令進行分離
命令如下:
binwalk cqzb.jpg
我們可以發現,binwalk自動識別出來了zip文件,而且偏移也告訴我們了,當然我們這裏如果使用
binwalk cqzb.jpg -e
這樣的命令,是很快就能把ZIP文件給提取出來的,但是這裏我想講的是如何用winhex等16進制編輯器,將壓縮包提取出來。
使用winhex16進制編輯器提取ZIP文件
- 首先需要了解一下什麼是文件頭
文件頭就是是位於文件開頭的一段承擔一定任務的數據。一般都在開頭的部分。以jpg圖片和zip壓縮包文件爲例。 - 圖6和圖7分別是jpg圖片的文件頭以及jpg圖片的結尾。
我們如何,找到JPG圖片和ZIP圖片呢?
JPG圖片的文件頭和結束標誌

上圖,FF D8 FF E1就是JPG圖片的文件頭,一般當我們看到文件開頭是如此的格式,我們就能認爲這是一個JPG圖片了。

上圖以 03 FF D9爲結束標誌,這是JPG圖片的結束標誌位。
ZIP文件的文件頭和結束標誌

上圖 50 4B 03 04就是ZIP文件的文件頭,一般以PK表示。
- 找到cqzb.jpg 中隱藏的ZIP文件
上文我們講述了,JPG圖片的結束標識是03 FF D9,ZIP文件的文件頭是50 4B 03 04,我們只需要在winhex中找到ZIP文件的文件頭即可,
滑動滾條到最底下。上文講了一般附加的位置是在原本文件的後面,所以我們果斷滑動滾動條到最後。

從圖中我們可以明顯看到cqzb.jpg明顯不是以FF D9結尾,而且我們在上面不遠的地方發現了zip的文件頭50 4B 03 04,所以我們可以斷定這是個圖種文件了
- 分離ZIP文件
下一步我們該如何用winhex截取我們所需要的文件呢?
我們選取以50開頭以及到末尾的的數據,右鍵單擊,選擇編輯,複製選塊到新文件,保存新文件爲zip格式命名規則即可。

保存爲ZIP文件,解壓縮後就能得到flag,所以最後的flag是flag{This is easy}
這裏我說的是使用比較傳統的分離方法
還有一些簡單的操作(由於時間比較晚了,我直接寫命令了)
在linux中使用
foremost進行分離
具體命令如下:
foremost 1.jpg
這樣就可以了
也可以使用binwalk
具體步驟想一下哦!!!!(百度也是可以的)
題目.zip(0.042 MB) 下載附件