標籤:

隱寫技巧——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上值得學習的項目:

github.com/RobinDavid/L

github.com/cyberinc/clo

下面對cloacked-pixel進行測試

測試圖片:

源文件下載地址:easyicon.net/language.e

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

下載地址:github.com/3gstudent/PN

加密前後對比如圖

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

下載地址:caesum.com/handbook/Ste

環境搭建:安裝jdk,配置java環境

使用Stegsolve打開a.png,選擇Analyse-Image Combiner,選擇b.png

進行異或對比(XOR),如圖,檢測到細微的差異

03 C++實現

Grant Curell分享了通過c++實現的方法,值得學習,所以在此對其介紹並進行測試

文章地址:codeproject.com/Article

作者:Grant Curell

代碼下載鏈接:codeproject.com/KB/secu

測試環境: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

下載地址:github.com/3gstudent/PN

生成去掉多餘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:

github.com/3gstudent/PN


推薦閱讀:

2017-09-11
一招搞定英語中證券技術分析的「黑話」
2017-08-15
如何攻擊 IP 攝像頭並搭建分析環境?

TAG:技术分析 |