最近有一部劇人氣非常高,據說是將軍官和醫生的浪漫故事。咦?!!這不是好幾年前的老片子了麼。
後來有人告訴我,是一部韓劇,裡面的歐巴超帥妹子超靚。~\(≧▽≦)/~
說起韓劇,很多真是在用心做劇,拋開裡面的細節,光憑人氣來說,不得不佩服其文化輸出軟實力。小夥伴們還記得2012年出品的黑客劇《幽靈》嗎?該劇以網絡犯罪和網絡刑警為題材,講述了虛擬搜查隊在揭開一個個不為人知的隱藏在網絡世界尖端技術中的秘密時,所經歷的各種駭人聽聞事件和奇遇。劇中出現了Encase、wireshark、od、process、nmap、DDOS、winhex、bt5等等多款大家熟悉的工具,不得不佩服其做劇的專業程度。
今天我們就來看看其第二集,男主角在所謂的「證據」面前,堅稱自己是清白的,說「證據」視頻其實是使用了隱寫技術,裡面隱藏著重要秘密,為了證明自己,便在警察面前當場進行了隱寫信息的提取。
根據視頻,我們可以判斷出,男主角使用的是openstego隱寫軟體,但是視頻中的情節確實有些瑕疵,有穿幫的成分。
這是男主角在挑選隱藏有信息的載體視頻文件,大家可以看到裡面全都是avi格式的視頻。
這是選中後的畫面,明顯可以看到載體文件實際上是png圖像文件。
下面是提取出的秘密文件,該文件記錄了被害人遇害的一些重要信息。
劇中講述的是,男主角從一段視頻中提取出了另外一段視頻。而根據上面的細節判斷,顯然不是這樣,而是從一個png文件中提取了視頻文件。
這是該軟體在選取載體文件時的顯示,可以看出只支持圖像文件作為載體進行隱寫,難怪劇組為了劇情的完整性,不惜使用改後綴名的方式來走捷徑。其實劇組可以專門去找支持視頻隱寫的軟體來進行這段劇情,估計是不太好找。o(︶︿︶)
既然都講到這了,那我們不妨一起來看看劇中所使用的隱寫術到底是神馬鬼。
隱寫術是信息隱藏(Information Hiding)的一個重要分支,而信息隱藏是為了不讓除預期接收者之外的任何人知曉信息的傳遞事件或者信息內容,可見信息隱藏與信息加密的不同處在於前者很好地隱蔽了傳遞事件。隱寫術英文名為Steganography,來源於特裡特米烏斯的一本講述密碼學與隱寫術的著作Steganographia,該書書名源於希臘詞彙stegons和graphia ,意為「隱秘書寫」。
0x01 數字圖像隱寫原理圖像隱寫,顧名思義就是將目標信息隱藏在載體圖片中,而這裡的目標信息包含任何格式的數字文件(圖像、文本、視頻、聲音等)。可能有同學會說,這個我也會,copy /b分分鐘搞定隱寫。是這樣嗎?!!!我們先來看看copy /b是何方神術。
使用copy/b image.jpg+text.txt new.jpg命令將文本text.txt附加到圖片image.jpg中
可以從源文件和生成文件的文件信息中觀察到,源文件的文件大小相加正好等於生成文件的大小。
同時打開原圖片和生成的新圖片,視覺上並沒有任何差別。
使用UE對比兩圖片的二進位差異,發現新生成的圖片末尾追加了text.txt文本內容。
疑問:為什麼新生成的圖片末尾添加了新的數據,卻用圖片查看器查看時並沒有看到圖片新增了其他內容?
釋疑:jpg格式圖片中,文件頭中包含有圖片X軸、Y軸的像素數目,所以圖像查看器只根據像素信息進行圖像的解析顯示,而不會將末尾追加的二進位信息進行顯示(即使將追加的信息也顯示出來,也不會是文本內容,而是一堆雜亂的像素噪點)。
由此可見,copy /b命令只是將幾個文件進行了簡單的追加合併,以達到隱蔽傳送信息的目的,但是這種方法通過對比圖像大小和文件大小,很容易檢測到圖像後面是否追加數據,所以copy/b只能算作一種簡單的圖像隱寫技術。
而通常的圖像隱寫為了躲避檢測,會利用載體的冗餘度,在不破壞圖像畫質信息的基礎上,嵌入被隱寫信息,達到隱寫目的。所以,如何利用圖像文件的冗餘來進行信息的隱藏,是隱寫技術的關鍵所在。
0x02 bmp圖像文件格式常見的圖像文件格式有BMP、JPG、JPEG、PNG、GIF。由於BMP採用位映射存儲格式,除了圖像深度可選以外,不採用其他任何壓縮,佔用的空間很大,所以存在著較多的冗餘空間利用,並且在bmp格式圖片中進行隱寫較為容易。這裡我們選用BMP格式的圖片來做接下來的講解。首先我們先了解bmp圖像文件的格式。
BMP圖形文件,又叫Bitmap(位圖)或是DIB(Device-Independent Device,設備無關位圖),是Windows採用的圖形文件格式,在Windows環境下運行的所有圖象處理軟體都支持BMP圖象文件格式,並且Windows系統內部各圖像繪製操作都是以BMP為基礎。
注釋:位圖信息頭和調色板的長度會根據不同情況而變化,所以可以根據bfOffBits這個偏移值迅速的從文件中讀取到位數據。
以上圖作為測試圖,查看其文件頭的對應信息
調色板
根據圖像尺寸和信息頭大小,我們可以得知這幅圖是不含調色板信息的。這是為什麼呢?
首先需要了解一下圖像文件中顏色的表示方法,我們知道自然界中的所有顏色都由紅、綠、藍(R,G,B)組合而成,下表位常見的RGB組合。
給一幅圖中每個象素賦予不同的RGB值,就形成了彩色圖。但是,如果有一個長寬各為200個象素,顏色數為16色的彩色圖,每一個象素都用R、G、B三個分量表示。每個象素需要用3個字節,整個圖象要用200×200×3,約120k字節!這也太浪費了!
這幅圖中最多只有16種顏色,而我們卻為每一個像素付出了3個字節的空間。為了壓縮,我們可以用一個表來記錄這16種顏色,表中的每一行記錄一種顏色的R、G、B值。這樣表示一個象素的顏色時,只需要指出該顏色是在第幾行,即該顏色在表中的索引值。例如,如果表的第5行為255,0,0(紅色),那麼當某個象素為紅色時,只需要標明5即可。
這樣可以節省多少空間呢?16種狀態可以用4位(bit)表示,所以一個象素要用半個字節。整個圖象要用200×200×0.5,約20k字節,再加上表佔用的字節為3×16=48位元組,整個佔用的字節數約為前面的1/6,可見這個壓縮效果非常明顯。
調色板(Palette)的作用便是上面的顏色查找表。調色板在windows裡的結構定義如下:
該結構除了R、G、B三個元素外,還有一個顏色深度信息。
既然調色板可以壓縮存儲空間,為什麼這張BMP不帶調色板呢?
這張BMP是24位真彩色的BMP,所謂真彩色圖(true color),就是它的顏色數高達256×256×256種,也就是說包含我們上述提到的R、G、B顏色表示方法中所有的顏色。真彩色圖並不是說一幅圖包含了所有的顏色,而是說它具有顯示所有顏色的能力,即最多可以包含所有的顏色。如果用調色板,則調色板的長度高達24位,即索引需要24位來表示,則一個象素也要用24位,和直接用R,G,B三個分量表示用的字節數一樣。這樣即沒有起到壓縮的作用,反而因為有一個龐大的調色板的存在而體積增大。所以真彩色圖直接用R、G、B三個分量表示,又叫做24位色圖。
數據區域
Bmp文件最後的區域則是數據區域,存儲著圖像像素信息,從前面信息段裡得知該圖為24位圖,所以每一個像素都以3位元組的RGB形式進行存儲。
現在我們大體了解了BMP圖片的基本結構,那麼要把隱寫的數據藏在哪裡呢?顯然,藏在文件頭或者信息頭裡是不現實的,因為這些區域中的每一個欄位都對應著明確的值,改變這些值會徹底破壞原有的結構而導致圖片損壞,雖然文件頭中有保留欄位,但是這些欄位容量有限不適合用於隱寫。看來只剩下圖像數據段適合用於隱寫了,如何利用像素的RGB來進行隱寫呢?
0x03 像素視覺差異bmp圖像中一個像素點使用3個字節(即RGB結構)來記錄色彩,而隱寫是把信息拆解後分別藏入像素點中,並且不會產生視覺上的變化。首先來看一下像素色彩在發生不同變化時的色彩差異。
可見RGB最低位的變化不會產生視覺上的差異。
上圖可以看出隨著改變位數的增加,像素點的顏色開始發生變化,當低5位均變化後,與原像素點相比發生了較為明顯的顏色改變。我們可以利用圖像的這一特性,將信息分拆為若干比特位,將其逐一放入圖像的像素點的低位,這便是著名的LSB(Least Significant Bit)隱寫。
0x04 LSB隱寫實戰我們採用LSB方式進行隱寫,下圖為需要隱寫的文本信息。
將文件按比特分拆後,逐一寫入載體圖片的像素信息中。問題來了,解密的時候怎麼知道需要解密的信息有多長?!!所以在隱寫數據前需要把隱寫的信息長度寫入。
圖片一個字節隱寫1比特數據,效果如下圖所示。
兩張圖的具體對比信息。
可以從兩圖的字節差異數中看到,並不等於隱寫信息字節數*8。這是因為原數據的最低位恰好與隱寫的比特值相等,從而使原數據並未發生變化。
現在我們將代碼中控制拆分尺寸bit=1修改為bit=2,即圖像數據字節的低2比特位用於隱寫,效果如下。
可見低2比特的改變並不會引起視覺上的差異,但卻使得隱寫空間增加了2倍。設置bit=4,即使用低4比特位用於隱寫,效果如下。
可見隱寫後的圖片像素已經發生了明顯變化。
再瘋狂一點,我們將bit設置為8,即把像素字節全部用於隱寫,其實這已經相當於覆蓋數據,結果則如下圖慘不忍睹。
圖中對應位置的原始像素值完全被破壞,完全成了文本文件的數據。由此可見,使用LSB技術隱寫時,最佳選擇最低位的1-2bit進行隱寫。
下面是還原隱寫信息的關鍵代碼:
還原後的文本信息對比。
0x05 隱寫升級由於上面採用順序隱寫的方法,所以導致信息集中在圖片的某一部分(下圖中的差異對比圖下方出現較寬區域的噪點)。
為了消除信息過於集中而導致圖片某一區域像素信噪比過高,可以採用隨機分配隱寫位置的方式,將信息分散隱寫在圖片當中。這裡需要注意的是,為了提取隱寫信息的方便,我們並不會真正採用隨機的方式進行隱寫,否則需要將隨機序列也一同記錄在圖片中。為了方便起見,我們採用將密碼作為隨機數生成器的種子,來生成一組偽隨機數。
隨機序列生成函數
可以看出生成隨機數列有三個輸入參數,其中圖片長度可以根據圖片文件的信息頭進行獲取,而其他兩個參數可以作為密鑰由用戶保存,在信息提取時,必須在知道key和size的情況下才可以正確地提取完整信息。
下圖為採用隨機LSB隱寫後的差異結果。
隱寫技術的基本原理和步驟了解後,我們會發現,如果對像素數據進行逐比特位提取,則很容易還原出原始數據,所以在實際應用中,隱寫技術都配合加密技術一同使用,在隱寫前,信息先進行加密處理,然後將加密後的密文進行隱寫。這樣便很好地保護了信息的安全性,即使信息被提取,也只是密文被暴露。
0x07 一些思考
圖像的像素點在改變較低位比特數值時,並不會引起視覺的變化,那麼視頻、音頻等一樣可以作為隱寫載體進行信息的隱寫。可見能作為載體的素材很多,在網際網路上也是海量的,如果一些有害信息通過這種技術來傳播,則危害極大。
如何對含有隱寫信息的載體進行快速檢測便顯得非常重要,圖像各區域之間的像素值是有關聯性的,而隱寫的數據則打破了像素之間的關聯性和圖像的平滑性,而一些針對隱寫技術的檢測技術正是根據這一特性來進行的,感興趣的同學可以查閱相關領域的研究資料,網上有很多相關素材。
*原創作者:追影人,本文屬FreeBuf原創獎勵計劃文章,未經許可禁止轉載