原題:
This time Fady learned from his old mistake and decided to use onetime pad as his encryption technique, but he never knew why people call it one time pad! Flag will start with ALEXCTF{. https://mega.nz/#!DGxBjaDR!tMWkHf0s0svmkboGd-IASHsS9jACxSYx4zi_ETsyzyQ
下載鏈接中的文件后,文件內(nèi)容如下:
0529242a631234122d2b36697f13272c207f2021283a6b0c7908
2f28202a302029142c653f3c7f2a2636273e3f2d653e25217908
322921780c3a235b3c2c3f207f372e21733a3a2b37263b313012
2f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d
283f652c2b31661426292b653a292c372a2f20212a316b283c09
29232178373c270f682c216532263b2d3632353c2c3c2a293504
613c37373531285b3c2a72273a67212a277f373a243c20203d5d
243a202a633d205b3c2d3765342236653a2c7423202f3f652a18
2239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c
263e203d63232f0f20653f207f332065262c3168313722367918
2f2f372133202f142665212637222220733e383f2426386b
題目中提示是One Time Pad的重用導致的攻擊祝闻。我首先把密文直接放到了CyberChief里看看能不能解密渗勘。用了Magic模式并不能直接得到明文妹卿。
因為OTP是利用明文XOR密鑰得到密文的活烙,我又嘗試了XOR bruteforce须尚,也不能迅速地得到明文贝搁。
對于OTP密碼的重用郑气,我們可以利用Crib dragging attack來破解腕够。這是一種已知部分明文的攻擊级乍,counter mode的block cipher如果重用了IV或者counter也可以用這種攻擊。具體的解釋如下:http://travisdazell.blogspot.com/2012/11/many-time-pad-attack-crib-drag.html
實現(xiàn)這種攻擊的腳本:https://github.com/SpiderLabs/cribdrag
利用這個腳本來破解題目中的密文:
首先把原文件中有換行的密文合并成一行帚湘,把這行密文放入腳本中:
程序會提醒我們輸入一個可能存在于明文或者密鑰里的字符串玫荣,根據(jù)題目提示,flag的開頭是?ALEXCTF{大诸,把這串字符輸入:
可以看到0這個選項就是有意義的字符串捅厂。對于可能有意義的字符串,程序會在序號之前加上***资柔。程序提示輸入正確的位置焙贷,我們輸入0。程序又會提示我們輸入我們的crib是明文中的還是密鑰中的贿堰,假設flag是密鑰辙芍,就輸入key:
這樣程序就恢復了一部分明文。在剛才的結(jié)果中羹与,不止0一個位置是有意義的故硅,*** 260: "ncryptio"也同樣有意義。再次輸入ALEXCTF{纵搁,輸入260作為正確的位置〕孕疲現(xiàn)在的結(jié)果如下:
回到明文開頭,我們可以猜測這是一封信的開頭腾誉,F(xiàn)ri開頭的單詞很可能是Friend徘层。輸入“Dear Friend,”作為crib利职。得到0: "ALEXCTF{HERE"趣效。?
根據(jù)flag的常見格式,可以猜測HERE之后是下劃線猪贪。將“ALEXCTF{HERE_”作為crib輸入:
得到有意義的字符串有:?*** 260: "ncryption sch"跷敬,?*** 234: "gree with me ",*** 208: "cure, Let Me "哮伟,*** 182: "ever if the k"干花,*** 156: " proven to be"妄帘,*** 130: "hod that is m",*** 104: "is the only e"池凄,*** 78: "n scheme, I h"抡驼,*** 52: "sed One time ",*** 26: "nderstood my "
先看260肿仑,可以猜測后面的單詞是scheme致盟,輸入"ncryption?scheme "作為crib:
260: "ALEXCTF{HERE_GOES"
將新的key后面加上下劃線輸入:
*** 260: "ncryption scheme a",?*** 234: "gree with me to us"尤慰,*** 208: "cure, Let Me know "馏锡,*** 182: "ever if the key is",*** 156: " proven to be not "伟端,*** 130: "hod that is mathem"杯道,*** 104: "is the only encryp",*** 78: "n scheme, I heard "责蝠,*** 52: "sed One time pad e"党巾,*** 26: "nderstood my mista",*** 0: "Dear Friend, This "
52的后面幾乎可以確定是encryption霜医,而且這樣填充的字母多齿拂,所以這次輸入"sed One time pad encryption":
52: "ALEXCTF{HERE_GOES_THE_KEY}AL"
這樣我們就可以看到完整的flag。把flag作為密鑰放到cyberchief里驗證:
注意:
1.在cyberchief中肴敛,需要先將hex轉(zhuǎn)換成字符串再與字符串XOR
2. 如果猜錯了字符署海,解密出來會出現(xiàn)奇怪的東西,或者不能繼續(xù)得到有效的字符串医男,可以回到上一個確定的字符串再次猜測
3.選擇解密出的明文時要選擇那種可以準確猜測出更多字符的明文字符串
4. 如果對明文和密文都沒有信息砸狞,可以從常用英文單詞開始猜,如“the, it, he, she”, 或者嘗試題目中的關(guān)鍵詞
5. 如果key或者message里有一個字母大小寫錯誤會導致另一個解密出的大小寫相反.?