Lsb圖片隱寫

前言算法

在剛剛過去的網鼎杯第一場比賽中,作到了一道雜項題是關於lsb隱寫的。LSB全稱爲 least significant bit,是最低有效位的意思。Lsb圖片隱寫是基於lsb算法的一種圖片隱寫術,如下統稱爲lsb隱寫,這是一種常見的信息隱藏方法。固然關於圖像的隱寫的方法有不少,統稱爲隱寫術,之後會寫一篇總結這類隱寫的文章。這裏只把lsb隱寫單獨拿出來分析,由於lsb隱寫很實用,算法簡單,能存儲的信息量也大,更況且是CTF比賽中的常客。還有一個緣由是最近本人作的很多雜項題的坑都踩在了lsb隱寫上(是我太菜了,大神莫笑。),因此發誓必定要把這類題搞清楚。
圖片描述編程

隱寫術簡介工具

先簡單的講講什麼是隱寫。因爲咱們識別聲音或圖片的能力有限,所以稍微改動信息的某一位是不會影響咱們識別聲音或圖片的。隱寫和加密之間的相同點就是,都是須要通過特殊的處理才能得到特定的信息。它們之間的不一樣點簡單的說就是,加密的話會是一些奇怪的字符,或數據。隱寫的話,就是信息明明就在眼前,可是你卻視而不見。古人的藏頭詩也是隱寫的一種啦。
圖片描述ui

Lsb隱寫加密

其實吧一開始我是想把一大堆算法理論和公式擺上來說講lsb隱寫是什麼,可是想一想,這種作法是真的可惡啊,擺明不想讓人看嘛。因此我想先從一道例題出發,原理什麼的將在這個過程當中,細細地講來。
先來看下面一張圖,這道題來自實驗吧(原題連接:http://www.shiyanbar.com/ctf/1897),題目名字叫--最低位的輕吻。

圖片描述

打開看是一張很著名的圖片-----勝利之吻。圖片是bmp格式。看到題目中有最低位幾個字,若是是對隱寫類的題目熟悉的話就能一會兒想到是lsb隱寫。由於lsb隱寫就是利用的圖像中的最低有效位。最低有效位這個詞在前文中出現不少次了,可是究竟是什麼意思呢?
首先來說png圖片,png圖片是一種無損壓縮的位圖片形格式,也只有在無損壓縮或者無壓縮的圖片(BMP)上實現lsb隱寫。若是圖像是jpg圖片的話,就無法使用lsb隱寫了,緣由是jpg圖片對像數進行了有損壓縮,咱們修改的信息就可能會在壓縮的過程當中被破壞。而png圖片雖然也有壓縮,但倒是無損壓縮,這樣咱們修改的信息也就能獲得正確的表達,不至於丟失。BMP的圖片也是同樣的,是沒有通過壓縮的。BMP圖片通常是特別的大的,由於BMP把全部的像數都按原樣儲存,沒有進行壓縮。
png圖片中的圖像像數通常是由RGB三原色(紅綠藍)組成,每一種顏色佔用8位,取值範圍爲0x00~0xFF,即有256種顏色,一共包含了256的3次方的顏色,即16777216種顏色。而人類的眼睛能夠區分約1000萬種不一樣的顏色,這就意味着人類的眼睛沒法區分餘下的顏色大約有6777216種。
圖片描述spa

LSB隱寫就是修改RGB顏色份量的最低二進制位也就是最低有效位(LSB),而人類的眼睛不會注意到這先後的變化,每一個像數能夠攜帶3比特的信息。
圖片描述命令行

上圖咱們能夠看到,十進制的235表示的是綠色,咱們修改了在二進制中的最低位,可是顏色看起來依舊沒有變化。咱們就能夠修改最低位中的信息,實現信息的隱寫。我修改最低有效位的信息的算法就叫作lsb加密算法,提取最低有效位信息的算法叫作lsb解密算法。
再放兩張圖加深下理解:
圖片描述code

圖片描述

回到題目上來,這裏咱們使用一款功能很強大的lsb隱寫分析工具---StegSolve圖片通道查看器(下載地址:http://www.caesum.com/handboo...)。
使用過photoshop的朋友應該對圖片通道有些概念,一幅完整的圖像,紅色綠色藍色三個通道缺一不可。一幅圖像,若是關閉了紅色通道,那麼圖像就偏青色。若是關閉了綠色通道,那麼圖像就偏洋紅色。若是關閉了藍色通道,那麼圖像就偏黃色。固然還有個Alpha通道,是一個8位的灰度通道,也能夠理解爲透明度(粗糙的理解)。關於圖像通道詳細的講解能夠自行百度,這裏再也不詳細說明。
使用stegsolve打開圖片,按右方向鍵查看各通道顯示的圖像。通常有些題目會在某一個圖像通道中直接顯示出flag,可是顯然這題不行,看來還須要繞些彎,要獲取最低位的圖片信息。
因此這道題的思路就是將圖片轉換成0,1 像素點(圖像處理問題),這裏能夠直接使用MATLAB(MATLAB特別適合圖像處理,並且語法特別特別簡單): 
在命令行窗口輸入如下命令:圖片

filename='01.bmp';
imfinfo(filename);
A = imread(filename);
B = logical(bitget(A,1));
imshow(B);
指令詳解:
圖片描述

運行得結果以下。掃描這個二維碼,就能直接獲得flag,有興趣的朋友能夠本身動手掃一下。
圖片描述rem

這裏還可使用其餘的編程算法來解,原理都是同樣的,但若是不會matlab語法,該怎麼辦呢。其實這題還有一種解法,由於只是簡單的獲取最後一位而後畫圖,可是爲啥stegsolve獲取不到呢。
咱們先來看下圖像信息:
圖片描述

發現是bmp的8位灰度圖。猜想是StegSolve解析8位的BMP存在問題?

常見的8位通道RGB圖像,3個通道共24位,即一張24位RGB圖像裏可表現大約1670萬種顏色;而16位通道RGB圖像,3個通道共48位,2的48次方是多少種顏色。32位深度CMYK(8位×4通道)。
這裏的8位、16位、32位指顏色深度(Color Depth)用來度量圖像中有多少顏色信息可用於顯示或打印像素,其單位是「位(Bit)」,因此顏色深度有時也稱爲位深度。
經常使用的顏色深度是1位、8位、24位和32位。1位有兩個可能的數值:0或1。較大的顏色深度(每像素信息的位數更多)意味着數字圖像具備較多的可用顏色和較精確的顏色表示。

試試轉換成png格式呢再看看呢?用畫圖另存爲png格式(不能直接改後綴)。此時發現文件變大,圖像信息以下圖:
圖片描述

用StegSolve打開後,在RGB的最後一位看到二維碼。(原圖在保存的時候顯示的類型是256色位圖,就是位深度爲8,若是保存爲24位位圖的bmp格式,不轉換爲png格式,也能用StegSolve找到如上圖的二維碼。)
圖片描述

圖片描述

因此咱們改變圖片位深度,就能獲得其中的二維碼信息。

Lsb隱寫的變形題

通過上面的例子,咱們基本上了解了什麼是lsb隱寫。通常的lsb隱寫咱們都能使用工具或者編寫程序提取到圖片的最低有效位信息,從而獲得其中的內容。可是出題人的腦洞不侷限於此,lsb隱寫還有各類擴展的使用方法。下面是網鼎杯第一場中的一道雜項題,也是一道lsb隱寫題。不一樣的是,光提取最低有效位是不能進行解答的。
首先給咱們的是一張花花的圖是png格式。題目名字是minify,使變小的意思,那應該就是指lsb隱寫。
圖片描述

光憑肉眼是真的什麼也看不出,咱們藉助於工具StegSolve進行分析。
一路翻下去,除了花花的仍是花花的,惟一值得懷疑的地方就在red plane 0 這裏是純黑,
圖片描述

圖片描述

說明這裏什麼也沒有,正常的圖片都不會是這樣子的,其它通道也都顯示正常。因此這個異常給咱們什麼啓示呢?從這裏能夠真正肯定是lsb隱寫了。

那咱們要從其餘的通道好比:blue、alpha、green中找些到信息。整張圖片看起來是毫無規則的像素點,那必定想把真正的信息隱藏起來,再用一些毫無規則的像素點干擾咱們。咱們若是想獲得其中的信息,就要去掉這些干擾點。可是到底去掉哪些呢。通過前面的步驟咱們知道了信息可能隱藏在plane 0中,因此咱們要先把各個通道的plane 0提取出來。Red plane 0由於是空信息,能夠不用提取了。咱們提取出(File->Save as)Green plane 0、Alpha plane 0、Blue plane 0,把他們各另存爲一張圖。而後各個圖進行比對(Analyse->image Combiner),最後發現Alpha plane 0 和Green plane 0 異或運算下的圖出現了flag
圖片描述

異或對比經常是爲了檢查兩張圖片之間的差別,能發現咱們肉眼看不到的及細微的差別。
圖片描述

上圖是異或(XOR)對比出一張圖片中的區別,因此用這個方法,也能把咱們的信息隱藏在其中,但我以爲這並非一種實用的方法。

後話
CTF中有關隱寫術的這類題目真的是考驗腦洞了,擴展開講,還有能有不少不少能夠舉例的。Lsb隱寫還能結合其餘的隱寫術,不僅是能隱藏一些圖片,還能把文件寫入其中。這類題目這就須要用其餘的工具進行文件提取分離,好比binwalk和foremost。固然,萬變不離其宗,這裏咱們只要把原理搞清楚就足夠了,剩下的就是解題思路,這就須要開開腦洞了。網上也存在着不少優秀的lsb隱寫算法,可以實現更多複雜的操做,有興趣的朋友能夠進一步的去了解。

參考文章:https://www.tuicool.com/artic...

相關文章
相關標籤/搜索