其實我個人不是很喜歡解隱寫術相關的題目,因為基本上能藏的方式可以說無限種,如果題目設計時沒有足夠的線索,很難在 CTF 比賽有限的時間內解出來,常常到最後都要等主辦方放額外的 hint 才有辦法做,但不可否認的,隱寫術在 security 的確佔了一席之地,至今在某些情境中仍然會被使用
中文是 隱寫術,因為名稱太長會被用 stego 稱呼,是屬於資訊隱藏的技術之一
stego 的原理是將資料根據某種規律拆散成很多個片段,再需要用大量的無效資料來隱藏被拆成片段有效資料,只有知道無效資料和有效資料配置規則的人,才有辦法把篩選出有效資料,再拼湊為原始資料
在電影或小說常出現的 <聖經密碼> 就是隱寫術的一種體現,需要根據某幾頁的某些文字組出其他有意義的文字,還有現在 PTT 或網路論壇很流行的藏頭詩也是隱寫術的一種,現在只要是排列整齊的文章大家都會想找看看有沒有藏頭....XDD
由於現代密碼學的盛行,其實真正重要且需要被傳遞的技術都會透過正式的加密技術給保護,光明正大地把密文給你攔截你也解不出來的意思,因此 stego 主要的用途是用來做一些偷偷摸摸的事情,像是:
Olympics CTF 是 2014 年趕上奧運熱潮的一場 CTF,之後就再也沒辦過了...XDD 但這場的題目趣味性和難度兼具,唯一一次在 ctftime 上辦還有 60 weight 的評分可見一班
題目給了一個檔案 stego.txt,裡面是好幾行字串,內容大致長這樣:
U3RlZ2Fub2dyYXBoeSBpcyB0aGUgYXJ0IGFuZCBzY2llbmNlIG9m
IHdyaXRpbmcgaGlkZGVuIG1lc3NhZ2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBubyBvbmV=
LCBhcGFydCBmcm9tIHRoZSBzZW5kZXIgYW5kIGludGVuZGVkIHJlY2lwaWVudCwgc3VzcGU=
看起來就是 base64,嘗試 decode 可以成功得到可閱讀的字串,像是第一行的內容會是:Steganography is the art and science of
,把文字拿去 google 會發現內容是源自於網路上某篇介紹 stego 的文章 http://stegstudio.sourceforge.net/steganography.html
文章本身沒什麼問題,但如果把文章重新 encode 回 base64,會發現跟 stego.txt 的內容不太相同,不同的都是發生在最後有 padding 的句子:
stego.txt:
IHdyaXRpbmcgaGlkZGVuIG1lc3NhZ2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBubyBvbmV=
orignal:
IHdyaXRpbmcgaGlkZGVuIG1lc3NhZ2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBubyBvbmU=
base64 的原理是把原本每個 char 代表的 8 bit 改成以 6 bit 表示,如果最後是由 =
或 ==
結尾,表示在 encode 之前的 data 不能以 6 bit 整除,因此會需要視情況補上一個或兩個 null byte 讓資料變成可以整除 6 bit
=
代表補上 1 個 null byte (8 bit),轉換為 base64 之後會有 2 bit 需要和原始資料一起 encode,剩餘 6 bit 就會以 =
表示==
代表補上了 2 個 null byte (16 bit),轉換為 base64 之後會有 4 bit 需要和原始資料一起 encode,剩餘 12 bit 就會以 ==
表示現在再回來看原本 stego.txt 的字串,就可以發現他並不是標準的 base64,最後 padding 的 bit 並非都是用 0 填充,原本單純用來 padding 的 2 bit 或 4 bit,就是這題隱寫術隱藏有效資料的地方
這題的具體作法是:
Base_sixty_four_point_five