0x00 隱寫原理
Jphide是基於最低有效位LSB的JPEG格式圖像隱寫算法,使用JPEG圖像作為載體是因為相比其他圖像格式更不容易發現隱藏信息,因為JPEG圖像在DCT變換域上進行隱藏比空間域隱藏更難檢測,並且魯棒性更強,同時Blowfish算法有較強的抗統計檢測能力。
由於JPEG圖像格式使用離散余弦變換(Discrete Cosine Transform,DCT)函數來壓縮圖像,而這個圖像壓縮方法的核心是:通過識別每個8×8像素塊中相鄰像素中的重復像素來減少顯示圖像所需的位數,並使用近似估算法降低其冗余度。因此,我們可以把DCT看作一個用於執行壓縮的近似計算方法。因為丟失了部分數據,所以DCT是一種有損壓縮(Loss Compression)技術,但一般不會影響圖像的視覺效果。
0x01 隱寫過程
Jphide隱寫過程大致為:先解壓壓縮JPEG圖像,得到DCT系數;然后對隱藏信息用戶給定的密碼進行Blowfish加密;再利用Blowfish算法生成偽隨機序列,並據此找到需要改變的DCT系數,將其末位變為需要隱藏的信息的值。最后把DCT系數重新壓回成JPEG圖片,下面是個人對隱寫過程理解畫出的大致流程圖。
0x02 隱寫實現
(1)Stegdetect
實現JPEG圖像Jphide隱寫算法工具有多個,比如由Neils Provos開發通過統計分析技術評估JPEG文件的DCT頻率系數的隱寫工具Stegdetect,它可以檢測到通過JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等這些隱寫工具隱藏的信息,並且還具有基於字典暴力破解密碼方法提取通過Jphide、outguess和jsteg-shell方式嵌入的隱藏信息。
(2)JPHS
而這里介紹另一款JPEG圖像的信息隱藏軟件JPHS,它是由Allan Latham開發設計實現在Windows和Linux系統平台針對有損壓縮JPEG文件進行信息加密隱藏和探測提取的工具。軟件里面主要包含了兩個程序JPHIDE和JPSEEK, JPHIDE程序主要是實現將信息文件加密隱藏到JPEG圖像功能,而JPSEEK程序主要實現從用JPHIDE程序加密隱藏得到的JPEG圖像探測提取信息文件,Windows版本的JPHS里的JPHSWIN程序具有圖形化操作界面且具備JPHIDE和JPSEEK的功能。
1.Windows用戶請下載JPHS-05 for Windows,同時也提供下載Linux版本。
2.分別准備一個JPEG格式的圖片(example.jpg)和一個文本文件(flag.txt)。
由於JPEG文件使用的數據存儲方式有多種不能一一演示,這里用最常用的JPEG格式-JPEG文件交換格式(JPEG File Interchange Format,JFIF)作為示例。
這里簡單介紹JPEG文件交換格式的JPEG圖片的圖像開始標記SOI(Start of Image)和應用程序保留標記APP0(Application 0),JPEG文件交換格式的JPEG圖片開始前2個字節是圖像開始標記為0xFFD8,之后2個字節接着便是應用程序保留標記為0xFFE0,應用程序保留標記APP0包含9個具體字段,這里介紹前三個字段,第一個字段是數據長度占2個字節,表示包括本字段但不包括標記代碼的總長度,這里為10個字節,第二個字段是標識符占5個字節0x4A46494600表示“JFIF0”字符串,第三個字段是版本號占2個字節,這里是0X0101,表示JFIF的版本號為1.1,但也可能為其它數值,從而代表了其它版本號。
3.Windows版本可以使用具有圖形化操作界面的Jphswin,選擇“Open jpeg”打開示例JPEG格式圖片example.jpg
如果你選擇的不是JPEG格式的圖片程序會自動退出,你可以16進制編輯器如Winhex查看圖片的圖像開始標記SOI和應用程序保留標記APP0,當載入JPEG格式圖片會顯示一些圖片的屬性。
4.選擇“Hide”選項之后在兩次文本框輸入相同的密碼,這里以輸入flag作為密碼為例,然后輸入要包含隱藏信息的文本。
5.選擇將要隱藏的信息如flag.txt。
6.選擇“Save jpeg as”選項將圖片另存為jpeg格式並輸入文件的名稱為新的圖像文件如C4n-u-find-f14g.jpg。
7.之后便可以看到生成結果和相關信息。
8.第2步到第7步做的是Jhide方式信息隱藏,接下來我們從C4n-u-find-f14g.jpg圖片提取出隱藏信息。
9.如果之前你並不知道圖片是基於什么方式進行信息隱藏,你可以使用Stegdetect先進行探測。
Stegdetect的主要選項如下:
-q 僅顯示可能包含隱藏內容的圖像。
-n 啟用檢查JPEG文件頭功能,以降低誤報率。如果啟用,所有帶有批注區域的文件將被視為沒有被嵌入信息。如果JPEG文件的JFIF標識符中的版本號不是1.1,則禁用OutGuess檢測。
-s 修改檢測算法的敏感度,該值的默認值為1。檢測結果的匹配度與檢測算法的敏感度成正比,算法敏感度的值越大,檢測出的可疑文件包含敏感信息的可能性越大。
-d 打印帶行號的調試信息。
-t 設置要檢測哪些隱寫工具(默認檢測jopi),可設置的選項如下:
- j 檢測圖像中的信息是否是用jsteg嵌入的。
- o 檢測圖像中的信息是否是用outguess嵌入的。
- p 檢測圖像中的信息是否是用jphide嵌入的。
- i 檢測圖像中的信息是否是用invisible secrets嵌入的。
-V 顯示軟件版本號。
如果檢測結果顯示該文件可能包含隱藏信息,那么Stegdetect會在檢測結果后面使用1~3顆星來標識
隱藏信息存在的可能性大小,3顆星表示隱藏信息存在的可能性最大。
從下圖可以看出很可能是Jphide的信息隱藏方式:
10.在知道隱藏方式之后可以開始進行信息提取,和使用JPHS進行信息隱藏過程類似,打開需要提取隱藏信息的圖片C4n-u-find-f14g.jpg,輸入對應密碼(在不知道密碼的情況不可以嘗試Stegdetect工具里的Stegbreak程序進行基於字典的暴力攻擊)flag,密碼驗證通過JPHS會自動提取隱藏信息,之后便可以另存提取出的信息。
11.打開提取得到的find.txt便可以得到我們想要的隱藏信息。
0x03 參考資料
轉載請注明來自4ido10n's Blog文章《深入理解JPEG圖像格式Jphide隱寫》