使用Stegsolve解答圖片隱寫(xiě)
1.1 題目分析
1.misc類題目
在i春秋給出的ctf比賽中,misc題目類型中,僅僅給出一個(gè)zip文件的下載地址,其中給出了一個(gè)提示“red0”,無(wú)任何其它提示,該zip文件為圖片文件其壓縮文件下載地址為:https://static2.ichunqiu.com/ictf/resources/attach/red0_a311fc237b75e084793fcfbfa4105bd0.zip
2.分析題意
red0是提示,以前未玩過(guò)圖片隱寫(xiě),不知道是啥意思,本次通過(guò)查看各種資料,知道其實(shí)這個(gè)就是red,選擇0值。
1.2解題思路
1.根據(jù)提示使用setgsolve進(jìn)行分析,首先進(jìn)行圖片轉(zhuǎn)換瀏覽,簡(jiǎn)單的會(huì)直接獲取flag。
2.通過(guò)數(shù)據(jù)抽取進(jìn)行分析
根據(jù)提示選擇圖像平面通道,通過(guò)預(yù)覽查看有無(wú)flag等關(guān)鍵字,有的可能是二進(jìn)制編碼01,將二進(jìn)制編碼提取出來(lái),通過(guò)代碼進(jìn)行處理或者在線轉(zhuǎn)換。
1.3實(shí)戰(zhàn)某ctf圖片隱寫(xiě)
1.下載Stegsolve
Stegsolve是一款圖片隱寫(xiě)分析軟件,支持常見(jiàn)的圖片文件格式,可提取GIF文件中的幀。當(dāng)兩張jpg圖片外觀、大小、像素都基本相同時(shí),可以考慮進(jìn)行結(jié)合分析,即將兩個(gè)文件的像素RGB值進(jìn)行XOR、ADD、SUB等操作,看能否得到有用的信息。StegSolve可以方便的進(jìn)行這些操作。打開(kāi)StegSolve,選擇“file”->”open”打開(kāi)一張圖片文件,然后選擇“analyse”->”image combine”選擇另一張圖片,默認(rèn)的XOR操作就可以看到隱藏的信息。點(diǎn)擊窗口下方的箭頭,可以看到不同combine方式下的結(jié)果。使用工具的優(yōu)點(diǎn)是簡(jiǎn)單方便,但是缺乏擴(kuò)展性,不能進(jìn)行批量自動(dòng)化處理。而對(duì)于自己編寫(xiě)的腳本,就可以方便的進(jìn)行擴(kuò)展。Stegsolve下載地址:http://www.caesum.com/handbook/Stegsolve.jar
2.運(yùn)行Stegsolve
如果系統(tǒng)安裝了java運(yùn)行環(huán)境,可以直接執(zhí)行Stegsolve.jar程序,否則需要通過(guò)命令行來(lái)啟動(dòng)java -jar Stegsolve.jar
3.打開(kāi)圖片
在Stegsolve中單擊“File”打開(kāi)本列中的圖片文件ez.png,注意開(kāi)始運(yùn)行Stegsolve.jar時(shí),其軟件默認(rèn)窗口比較小,打開(kāi)后效果如圖1所示。
圖1使用Stegsolve打開(kāi)圖片
4.圖像的位平面(bit plane)
(1)圖像位平面的定義
一幅256個(gè)灰度級(jí)的圖像可以分解成8個(gè)位平面,原因就是2^8=256,換句話說(shuō)每一個(gè)像素點(diǎn)的灰度值可以由8個(gè)二進(jìn)制位來(lái)表示,所謂的位平面(bit plane)就是依次取出每個(gè)像素點(diǎn)的數(shù)值組成一個(gè)位平面。舉一個(gè)簡(jiǎn)陋的例子,假設(shè)當(dāng)前圖像就有兩個(gè)像素點(diǎn),這兩個(gè)像素點(diǎn)的灰度值分別是1和3,那么其對(duì)應(yīng)的二進(jìn)制位分別為10000000和11000000,那么該圖像分解成8個(gè)位平面依次為11、01、00、00、00、00、00、00,即通過(guò)取前面兩個(gè)二進(jìn)制位的第一位、第二位、第三位等組成第一個(gè)位平面,第二個(gè)位平面,第三個(gè)位平面等。可以發(fā)現(xiàn),每一個(gè)位平面均為一個(gè)二值圖,也就是說(shuō)像素點(diǎn)的灰度值非0即1。
(2)位平面的matlab實(shí)現(xiàn)
可以在matlab中通過(guò)以下代碼進(jìn)行實(shí)現(xiàn),實(shí)現(xiàn)效果如圖2所示。
X=double(rgb2gray(imread('d:\test.bmp')));%將原始圖像轉(zhuǎn)換為灰度圖像,如果本身就是灰度圖可以去掉rgb2gray函數(shù)
[h w] = size(X);
subplot(3,3,1);
imshow(X,[]);
title('原始圖像');
for k=1:8
for i=1:h
for j=1:w
tmp(i,j) = bitget(X(i,j),k);%bitget函數(shù)首先將X(i,j)處灰度值分解為二進(jìn)制串,然后取第k位
end
end
subplot(3,3,k+1);
imshow(tmp,[]);
ind = num2str(k);
imti = ['第',ind,'個(gè)位平面'];
title(imti);
end
圖2實(shí)現(xiàn)位平面的效果
5.圖像平面通道瀏覽分析
在Stegsolve軟件下方中間文件使用向左或者向右的箭頭可以對(duì)圖片進(jìn)行各種變換,如圖3所示,顯示是Red plane 2圖像平面層,在Stegsolve中可以進(jìn)行Red/Green/Brue/Alpha 0-7通道的轉(zhuǎn)換,以及XOR等操作,某些題目可以直接通過(guò)該方法直接獲取flag值。
圖3圖像平面層轉(zhuǎn)換
6.提取數(shù)據(jù)分析(Data Extract)
在Stegsolve中單擊“Analyse”-“Data Extract”,如圖4所示進(jìn)行數(shù)據(jù)提取分析,在本例中,在“Bit Planes”中選擇“Red 0”,Bit Plane Order中選擇RGB。單擊Preview可以看到在上方存在存在01字樣數(shù)據(jù)。
圖4數(shù)據(jù)提取分析
解題技巧:
一般來(lái)講出題方都會(huì)給出提示,這些暗示有些會(huì)出現(xiàn)在題目上,有的會(huì)在注釋處,例如2014年XDCTF網(wǎng)絡(luò)安全大賽的web100題,題目中的圖片hackkey.png,明確是需要進(jìn)行解答的對(duì)象,在圖像文件的注釋主有“rd rgb”的提示,根據(jù)提示選擇位圖平面順序RGB,選擇Red0即可解題,如圖5所示,獲取其key為“Xd$eC@2o14”。
圖5位圖平面Red0解題
7.保存文件并分析
(1)保存二進(jìn)制文件
在Stegsolve中可以將分析的結(jié)果保存為txt文件和二進(jìn)制文件,要根據(jù)情況,如圖圖片中已經(jīng)出現(xiàn)了key則可以保存為txt文件,直接復(fù)制key或者flag來(lái)提交答案。在本例中由于出現(xiàn)的是代碼,還需要做進(jìn)一步分析,因此將其保存為二進(jìn)制文件2,然后使用notepad打開(kāi)該文件,如圖6所示,將二進(jìn)制01字段全部保存。
圖6打開(kāi)二進(jìn)制文件并提取二進(jìn)制代碼
(2)二進(jìn)制轉(zhuǎn)換查詢
在http://www.5ixuexiwang.com/str/from-binary.php網(wǎng)站中,復(fù)制數(shù)據(jù)進(jìn)行查詢:
011001100110110001100001011001110111101101010000001100010110001101011111010010000011010001110011010111110011001101110110001100110111001001111001011101000110100000110001011011100110011101111101
如圖7所示,查詢獲取其flag為:flag{P1c_H4s_3v3ryth1ng}
圖7獲取flag值
(3)python解碼二進(jìn)制
將一下代碼保存為ejz.py:
binary_string='011001100110110001100001011001110111101101010000001100010110001101011111010010000011010001110011010111110011001101110110001100110111001001111001011101000110100000110001011011100110011101111101'
import binascii
hex_string = "%x"%(int(binary_string, 2))
hex_string = hex_string[ : len(hex_string) / 2 * 2]
print "key :", binascii.a2b_hex(hex_string)
執(zhí)行 python ejz.py后,獲取其flag如圖8所示。
圖8python直接解碼獲取flag
1.4python編程解決jpg格式圖片
1.安裝
python操作圖片需要用到PIL(Python Imaging Library)庫(kù),可以通過(guò)easy_install PIL命令安裝。如果使用Mac系統(tǒng)系統(tǒng)的話,還可以用brew install pillow來(lái)安裝。安裝PIL后就可以import Image庫(kù)了。如果系統(tǒng)是64位還需要下載64位程序進(jìn)行安裝,下載地址https://files.pythonhosted.org/packages/e6/f0/7e6d01f026274363aaefb6b7e924f4b34b4a825a4bd8eaebfbd7d401af91/Pillow-2.1.0.win-amd64-py2.7.exe,32位程序可以參考進(jìn)行下載https://pypi.org/project/Pillow/2.1.0/#files
2.使用以下代碼進(jìn)行讀取
參考網(wǎng)友解決jpg格式文件的處理代碼,執(zhí)行后即可獲取二進(jìn)制代碼。
# -*- coding:utf-8 -*-
import Image
image = Image.open("hack.jgp")
width, height = image.size
binary_string = ""
for y in range(height):
for x in range(width):
#獲取坐標(biāo)(x, y)處的顏色值
r, g, b = image.getpixel((x, y))
color = (r << 16) + (g << 8) + b
#獲取顏色二進(jìn)制值的最后一位
last_bit = str(bin(color))[-1]
binary_string += last_bit
print binary_string
1.5總結(jié)
1.jpg等圖片文件包含其它文件
最簡(jiǎn)單的處理辦法,就是使用7zip、winrar等軟件直接打開(kāi)jpg文件,如圖9所示,在jpg文件中可以看到教育學(xué).txt,打開(kāi)后,可以看到是下載鏈接地址,這個(gè)方法是目前AV圖片種子的常見(jiàn)隱藏方法。
圖9winrar打開(kāi)壓縮文件
2. 種子圖片文件生成方法
先要有張圖,比如girl.jpg,在把種子用winrar壓縮,得到壓縮文件,比如av.rar,放在同一個(gè)文件夾下。再在該文件夾里建立一個(gè)txt文件,打開(kāi)輸入 copy /b girl.jpg + vvv.rar zzz.jpg,關(guān)閉保存。將txt文件后綴名改為bat,運(yùn)行以后就會(huì)生成一個(gè)文件zzz.jpg,就是圖種。使用時(shí)將zzz.jpg后綴名改為rar,解壓即得種子。
3.二維碼解碼
在有些題目中會(huì)給出二維碼圖片或者地址,將圖片上傳到http://tool.chinaz.com/qrcode網(wǎng)站后,會(huì)直接給出其flag值:flag{AppLeU0},如圖9所示。在進(jìn)行解碼過(guò)程中要特別注意,,隱寫(xiě)的載體是PNG或者bmp格式可以直接讀取,而對(duì)于經(jīng)過(guò)有損的壓縮,例如jpg格式就不行。
圖9獲取flag值
4.修改頭文件
有些題目會(huì)故意將文件頭信息類似“GIF8”去掉,這個(gè)時(shí)候通過(guò)觀察,將其修改成gif的頭文件格式即可正常查看。gif文件會(huì)通過(guò)幀來(lái)隱藏flag,推薦是用Namo_GIF_gr工具進(jìn)行查看。
5.圖片或者壓縮文件注釋信息等
在圖片文件或者壓縮文件注釋信息中往往會(huì)隱藏密碼或者flag,因此需要對(duì)其進(jìn)行分析和查看。
6.binwalk及foremost處理
(1)binwalk下載地址
https://github.com/ReFirmLabs/binwalk
(2)安裝
git clone https://github.com/ReFirmLabs/binwalk.git
(3)分析文件
binwalk ctf.jpg
加入分析結(jié)果中表明從140147處開(kāi)始,存在另外一個(gè)文件。
(4)分離文件
dd if= ctf.jpg of= ctf -1.jpg skip=140147 bs=1
這里if是指定輸入文件,of是指定輸出文件,skip是指定從輸入文件開(kāi)頭跳過(guò)140147個(gè)塊后再開(kāi)始復(fù)制,bs設(shè)置每次讀寫(xiě)塊的大小為1字節(jié),表示從ctf.jpg中分離出來(lái)ctf-1.jpg文件。
(5)安裝foremost
apt-get install foremost
(6)提取及分析文件
foremost ctf.jpg
當(dāng)我們使用這行命令后,foremost會(huì)自動(dòng)生成output目錄存放分離出文件,查看其文件夾下文件即可。
參考文章:
http://www.poboke.com/study/2014-xdctf-network-security-competition-web100.html