隱寫技巧——PNG文件中的LSB隱寫
00 前言
上篇對PNG的文件格式進行了分析,介紹了如何在不影響PNG文件的正常瀏覽下將payload以輔助數據塊tEXt的格式插入到PNG文件中。這次將要介紹一個在圖像數據塊IDAT下隱藏payload的技巧——LSB隱寫
01 簡介
IDAT數據塊
儲存圖像像數數據n在數據流中可包含多個連續順序的圖像數據塊n採用LZ77演算法的派生演算法進行壓縮n可以用zlib解壓縮n
zlib解壓縮的python實現代碼如下:
引用自http://drops.wooyun.org/tips/4862(因烏雲問題,跳轉至備份站)
LSB隱寫
LSB全稱leastsignificant bit,最低有效位nPNG文件中的圖像像數一般是由RGB三原色(紅綠藍)組成,每一種顏色佔用8位,取值範圍為0x00~0xFF,即有256種顏色,一共包含了256的3次方的顏色,即16777216種顏色n人類的眼睛可以區分約1000萬種不同的顏色n這意味著人類的眼睛無法區分餘下的顏色大約有6777216種nLSB隱寫就是修改RGB顏色分量的最低二進位位(LSB),而人類的眼睛不會注意到這前後的變化n每個像數可以攜帶3比特的信息n
02 Python實現
關於LSB隱寫在github上值得學習的項目:
https://github.com/RobinDavid/LSB-Steganography
https://github.com/cyberinc/cloacked-pixel
下面對cloacked-pixel進行測試
測試圖片:
源文件下載地址:http://www.easyicon.net/language.en/1119182-Enderman_Png_icon.html
1、 加密
運行:python lsb.py hide big.png 1.txt 123456
參數說明:hide:表示加密模式 big.png:待加密的png圖片 1.txt:存放payload123456:加密的密碼
運行後生成圖片big.png-stego.png
分析一下加密圖片big.png-stego.png的格式,使用上篇文章介紹的check.cpp
下載地址:https://github.com/3gstudent/PNG-Steganography/blob/master/check.cpp
加密前後對比如圖
cloacked-pixel在加密的過程中會刪除其他數據塊,只保留關鍵數據塊IDAT
使用HexEditorNeo查看加密圖片也能印證我們的判斷,如圖
注:當然也可以通過閱讀源碼進行分析
2、 解密
運行:python lsb.py extract big.png-stego.png3.txt 123456
參數說明: extract:表示解密模式 big.png-stego.png:待解密的png圖片 3.txt:存放導出的payload 123456:解密密碼
如圖,成功解密獲得payload
3、 分析
運行:python lsb.py analyse big.png-stego.png
參數說明:
analyse:表示分析模式big.png-stego.png :待分析的png圖片 運行後會對圖像進行分析,將其分割成塊,標記每個塊的最低有效位
這是加密前後分析對比圖
肉眼幾乎無法分辨圖片的差別,因為payload越短,分析圖的差別就越小,這裡我們可以藉助軟體幫助分析
工具名稱:Stegsolve
下載地址:http://www.caesum.com/handbook/Stegsolve.jar
環境搭建:安裝jdk,配置java環境
使用Stegsolve打開a.png,選擇Analyse-Image Combiner,選擇b.png
進行異或對比(XOR),如圖,檢測到細微的差異
03 C++實現
Grant Curell分享了通過c++實現的方法,值得學習,所以在此對其介紹並進行測試
文章地址:http://www.codeproject.com/Articles/581298/PNG-Image-Steganography-with-libpng
作者:Grant Curell
代碼下載鏈接:http://www.codeproject.com/KB/security/581298/PNG_stego.zip
測試環境:Win7 X64 vs2012
1、 直接編譯會報錯
項目zlib可直接編譯成功
編譯項目libpng,錯誤如下:
fatal error C1083: Cannot open includefile: zlib.h: No such file or directoryn
解決方法:需要對項目添加include目錄,右鍵-Property-VC++ Directories,選擇Include Directories
添加zlib-1.2.3,輸入:......zlib-1.2.3;
再次編譯,報錯如下:
fatal error LNK1181: cannot open input filezlib.libn
解決方法:需要對項目添加lib目錄,選擇Library Directories,添加zlib.lib,輸入:......LIB Debug;
如圖,編譯成功
Tips:在Include Directories和Library Directories中也可以直接指定絕對路徑(如C:testcloacked-pixel-masterPNG_stegozlib-1.2.3),本例使用..表示的是相對路徑
編譯項目PNG_encode_decode,發生同樣的編譯錯誤
解決方法:Include Directories下添加zlib-1.2.3和libpng-1.2.37-src,輸入:../zlib-1.2.3;../libpng-1.2.37-src;Library Directories下添加libpng.lib,輸入:..LIB Debug;
如圖,最終編譯成功
註:三個項目工程存在前後的調用關係,所以編譯順序為zlib-libpng-PNG_encode_decode
2、 加密測試
待加密文件:big.png
payload文件:1.txt
輸出加密文件:bigen.png
項目PNG_encode_decode中的main.cpp修改如下:
運行後生成bigen.png,如圖
對比加密前後的文件,大小存在差異,如圖
原理上LSB隱寫不會改變文件大小,查找原因
使用check.cpp解析數據塊目錄,發現加密後多了數個tTXt段
使用HexEditorNeo查看加密圖片細節,如圖
加密後的圖片包含了原圖片的一些信息,造成了圖片大小不同
3、 去掉多餘信息
方法a:使用HexEditorNeo直接刪除多餘信息
方法b:使用compress.cpp
下載地址:https://github.com/3gstudent/PNG-Steganography/blob/master/compress.cpp
生成去掉多餘tTXt段的加密圖片bigensimple.png,如圖
bigensimple.png同原圖片大小相同,如圖
4、 解密測試
項目PNG_encode_decode中的main.cpp修改如下:
運行後生成2.txt,獲得存儲加密後的payload
5 分析
對於LSB隱寫,可使用Stegsolve輔助分析
打開加密圖片後,選擇Analyse-DataExtract
Bit Planes 選中Reg、Green、Blue的第0位
Bit Order選中LSBFirst
Bit Plane Order選中RGB
可以看到加密形式的payload,如圖
註: 當然可以通過閱讀程序源碼找到圖片的加密數據,本例只是給出對圖片分析的一些參考思路
04 小結
本文分別介紹如何通過Python和C++實現對PNG文件的LSB隱寫,參照文中的分析思路也可對常見的LSB隱寫數據進行提取分析。
註:修改好的PNG_stego工程已上傳至github:
https://github.com/3gstudent/PNG_stego-test
推薦閱讀:
※2017-09-11
※一招搞定英語中證券技術分析的「黑話」
※2017-08-15
※如何攻擊 IP 攝像頭並搭建分析環境?
TAG:技术分析 |