wechall.net/stegano 解题心得
/* 轉載請注明出處:http://www.cnblogs.com/Martinium/p/wechall_stegano.html */
最近迷上了 www.wechall.net 網站,里面都是些與計算機相關的題目挑戰。題目又分很多類型,例如:加密與解密、隱寫術、網絡攻防、趣味編程、數學邏輯等。題目有的簡單,有的很難,需要一些知識和技巧。與其他題目挑戰的網站不同的是,在其他類似性質的網站注冊的用戶可以綁定到 WeChall?網站,然后?WeChall 提供排名信息,而且也分得很細,什么按總分全球排名、什么在自己國家的排名、什么解答某種語言網站題目的排名等。可以從解題的人數判斷題目的難易程度,有興趣的朋友可以去注冊,解題中也能學到很多知識。國內的學校和公司也有舉辦網絡攻防大賽。與玩 ACM 解題不同的是:ACM 提供給定的輸入和輸出,中間的黑盒部分需要你來完成,需要提供一種更好更快的算法;這類攻防挑戰題目可能需要更多的計算機知識,從一堆垃圾數據中發現有用的信息、越過不同的障礙終于發現答案等。
注:Steganography?是隱寫術,它與 Cryptography (密碼術)是不同的。
題目1?stegano1?給了一張彩色的 BMP 圖片,讓你從中發現答案。
不管是圖片、音頻文件,還是二進制文件,首先都可以嘗試以文本文件打開,查看是否存在可疑的字符串。文件太大了就不要這么做了,鼠標會轉圈好久的。
圖片很小,才 102 bytes。將圖片文件拖到文本編輯器里,就可以看到答案了。Notepad++ 是 Windows 上最好的文本編輯器,沒有之一。體積小巧,功能齊全。
Linux 上用 gedit 打開,或者使用 vim 命令,輸入 :%!xxd 切換到二進制模式,答案顯而易見。
xxd 是另外一個命令,以十六進制現實內容。再輸入 :%!xxd -r 命令執行,切換到原來的摸樣(r 是 reverse )。
注意 vim 的 -b 選項,是否以二進制模式打開。圖片是二進制文件,所以要加此選項,否則處理會有問題。
還有一個命令 strings,來的更快,直接輸出文件中可打印的字符,通常用來顯示二進制中的字符串常量。
strings 命令的選項 -n VALUE 或 --bytes=VALUE 選項控制輸出連續字符的最短長度,這個的默認值 VALUE 是 4。
還有 -t RADIX 或 --radix=RADIX 選項以后也會用上的,用來顯示每個字符串的偏移量。C++ 的 static 字符串變量需要這個偏移量索引字符串。
你我都是做題的,但是怎么出題呢?破解別人的軟件,寫一個序列號注冊機相對容易。但是如何寫一個加殼、混淆的難以破解的程序就有點難度了,畢竟建房子拆房子簡單。
我們需要了解一下 BMP 文件格式,BMP 圖片很占空間,沒有壓縮,或者用 RLE (Run-Length Encoding)壓縮一下,體積大所以很少在網絡上傳播。 BITMAPFILEHEADER,BITMAPINFOHEADER,
這樣寫,太容易被發現了。我們可以通過對字符串先加密再隱寫,或者用循環移位、異或操作增加難度。
知道 BMP 格式支持顏色索引模式(GIF、PNG 格式也支持),圖片里會有一個調色板用來存儲使用的顏色值,相當于一個數組存儲 RGB 值,然后圖片只用數組索引值找到對應的顏色并顯示出來,于是你也可以這樣隱藏你的信息到圖片中。我們用兩種顏色作圖,在白紙寫黑字,存儲為索引模式圖,于是調色板會有兩個值 #000000 和 #FFFFFF,顏色只需一位 0/1 就可以表示黑白顏色了(查表法從24位壓縮到1位,這個壓縮是可觀的,其實還可以用 RLE 行程編碼對圖片繼續無損壓縮)。將數組中的 #000000 值篡改成 #FFFFFF,也就是黑色改成白色,其他數據不用動,保存后用再打開圖片看發現,字消失了!寫一些想說的話,然后把圖片發給暗戀對象,對方會說你怎么發了一張空白圖片,于是留給對方想象的空間。說了這么多,自己動手嘗試一下吧~
?
題目2 Stegano Attachment?
答案在圖片中嗎?不,答案在附件(attachment)里。等你做出了這道題,就明白前面一句話的意思。有時候,題目會給出提示容易忽視的信息,而這個可能就是解題的關鍵。
稍微留心一下圖片?http://www.wechall.net/challenge/training/stegano/attachment/attachment.php?,是不是很壞?后綴被人改成 PHP 網頁后綴。用文本編輯軟件打開,發現一堆亂碼。不同文件會有不同的文件頭,即不同的 Magic Number,如上面的 BMP 格式圖片的 “BM” 標志,PNG 圖片有八字節頭 “\x89PNG\r\n\x1A\n”,用 Visual Studio 調式 C++ 代碼出現很多的“燙燙燙燙”,其實是編譯期初始化棧空間為 “\xCC\xCC\xCC\xCC”(0xCC 對應 x86 的 INT 3 中斷指令,你應該知道為什么這么做),編譯 Java 文件生成的 .class 文件的文件頭有 “CAFEBABE”。從 attachment.php 里我們看到了字符 "JFIF",應該就是 JPG 圖片了。更好的方法是用 linux 上的 file 命令查看文件類型,文件名后綴隨你怎么該。改成 .jpg 后綴后,打開圖片后,是電影 Ghostbusters (1984)?的海報,我們追到了這里,電影我沒看過,看介紹好像很不錯的樣子。一邊下載一邊解題吧~
martin@M2037:~/Desktop$ file attachment.php
attachment.php: JPEG image data, JFIF standard 1.01
我們稍微了解一下 JPEG 格式規范。JPEG 文件以 “\xFF\xD8” 打頭,以 “\xFF\xD9” 結尾。JPEG/JFIF 文件會出現 “JFIF” 字符,JPEG/Exif 文件會出現 "Exif" 字符。
jpg 圖片采用有損壓縮,不支持 alpha 通道。編碼時,顏色從 RGB 色彩空間轉到 YUV 色彩空間,根據顏色分量的重要性和人眼的感知剔除不重要的信息,縮減采樣 4:4:4 4:2:2 4:2:0,接著 分割圖片成 8x8 子區域進行離散余弦變換,量化編碼,支流系數用差分編碼,交流系數用 RLE 編碼。
我們發現圖片是以 "\xFF\xD8" 開頭的,但是結尾卻不是 "\xFF\xD9",好像明白了什么。
我們用題目1學到的 strings 命令搜到了可疑字符串?solution.txt 和?solution.txtPK,恰恰是放文件最后的。
PK 字眼熟悉不?最常用的 ZIP 格式壓縮文件頭的 magic number 是 “PK\x03\x04”,而且文件中確實存在這四個字節。而且這四個字節的前面也恰好是 "\xFF\xD9"。想想之前的題目 attachment。看來,是誰把一個 ZIP 壓縮文件追加到一個 JEPG 圖像文件的后面了。我們需要提取出 ZIP 文件,答案離我們不遠了。。
ZIP 文件的偏移量用題目1學到的 vim :%!xxd 搜索定位查看并計算,或者用 grep 命令搜索下。
我們需要復制從?0004f06 到最后?0004f8d (長度 0x88=136)到新的文件里去。
復制粘貼文件或者段落用 Ctrl+C、Ctrl+V,可是復制二進制文件流呢,也可以這么做嗎?好像不行。
Notepad++ 不愧是最好用最實用的文本編輯器,選擇菜單 Edit -> Paste Special,二級菜單中出現了 Copy|Cut|Paste Binary Cotent,接下來你知道怎么做啦~
或者使用 linux 的 dd 命令,還記得大學初學 linux 操作系統時,讓記那么多命令和參數干嘛,現在就派上用場了。
如果你不嫌麻煩,甚至可以自己編寫小段 C/C++ 代碼,打開文件、復制文件、關閉文件。
martin@M2037:~/Desktop$ printf "%d\n" 0x0004f06
20230
martin@M2037:~/Desktop$ dd if=attachment.jpg of=solution.zip skip=20230 bs=1 count=136
136+0 records in
136+0 records out
136 bytes (136 B) copied, 0.0021692 s, 62.7 kB/s
martin@M2037:~/Desktop$ unzip solution.zip
Archive: solution.zip
inflating: solution.txt
打開 solution.txt 文件,就是最終的答案了。
從中,我們學習了另外一種隱藏文件的方法,將一個文件附屬到另外一個文件末尾,打開的時候只解析第一個文件,附屬文件被忽略了。
將信息 message.txt 隱藏到圖片 carrier.jpg 中(注意命令行中的先后順序):
linux 終端下, cat carrier.jpg message >> mixed.jpg
Windows 控制臺下,copy carrier.jpg /b + message.txt /a mixed.jpg
cat 是 concatenate 的簡寫,如果有多個序列文件(比如 file1.txt file2.txt file3.txt)合并,可以優雅地寫成 cat file{1,2,3}.txt >> new.txt
/A /B 分別代表文本文件和二進制文件,詳情請查看 copy /? 命令。
題3?LSB - The least significant bit
WeChall 網站使用了 cookie 和 session 來產生動態的答案,所以不同的人在每一次登錄時,答案是不同的。我在這里貼出我的答案,你復制過去一般就是錯誤的答案,這樣可以提防不動腦子只粘貼答案的人。
這道題目有鏈接提示,鏈接的顏色是 #EEE,接近背景色白色 #FFF,還是很明顯看得出來的,看來作者沒有有意隱藏這一提示。家里網沒能打開這個鏈接,原因還沒查出,公司網可以打開。steganabara 原來是一個 .jar 包,下載 steganabara.jar 文件并運行程序 java -jar steganabara-1.1.1.jar?,將隱藏信息的圖片拖進來。似乎是很正常的一張圖片,LED 數碼管顯示了作者的大名 Gizmore。查了一下,gizmor 英文是小發明的意思。當然,這只是作者創作題目的署名,與解題沒有任何關系。解題偶爾能有額外的收獲。
這張圖片是 RGB 格式,沒有 alpha 通道,隨便勾選 RGB 某一通道的某一位,共有 3*8=24 種單項選擇(復合選擇暫未考慮進來,從簡單到復雜嘛~)。點擊菜單 Filter -> Bit Mask,從低位到高位一個一個勾選盲試的話,很容易試出答案來。思路是這樣的,你的答案不一定是這樣的。注意勾上 Amplify 選項,否則很難辨認。
借助事實分析和判斷,點擊菜單 Analyse -> Histogram 給出 RGB 各分量的柱狀圖,范圍是 0~255,有 3 個連續分布圖和 1 個離散分布(斑馬帶)圖,可以懷疑出是哪個通道有問題。相鄰柱子的間距是周期,可以推斷出是哪個比特位被篡改,導致出現重復的模式。
LSB (least significant bit) 最低有效位,權重最小的位,也是修改最不容易引起注意的位;與之對應的是 MSB (most significant bit) 最高有效位,修改后很容易被察覺。上面之所以需要增強信號(Amplify) 就是因為隱藏的信息在 LSB 上不易被發覺。這個是圖片與圖片的操作,我想到了一種字符串與圖片混合的辦法。
將字符串信息(也就是需要隱藏的信息 ASCII 碼值)拆開成比特位,分別藏在圖像中的連續像素中的最低位。思路是讀取承載信息的圖片,然后把需要隱藏的信息以比特流的形式連續覆蓋圖片 RGB 值的最低位,為了進一步增加難度,可以只覆蓋其中某一個分量,可以不用放最低位,如果比特位用完了,信息可以從頭循環再覆蓋,直到覆蓋所有。例如此題采用的是 Blue 通道的第 4 位。
?
to be continued...
?
轉載于:https://www.cnblogs.com/Martinium/p/wechall_stegano.html
總結
以上是生活随笔為你收集整理的wechall.net/stegano 解题心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试思想-测试设计 测试用例设计之正交法
- 下一篇: storyboard 如何用代码调用