原题:
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
下载链接中的文件后,文件内容如下:
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
实现这种攻击的脚本:https://github.com/SpiderLabs/cribdrag
利用这个脚本来破解题目中的密文:
首先把原文件中有换行的密文合并成一行,把这行密文放入脚本中:
程序会提醒我们输入一个可能存在于明文或者密钥里的字符串,根据题目提示,flag的开头是 ALEXCTF{,把这串字符输入:
可以看到0这个选项就是有意义的字符串。对于可能有意义的字符串,程序会在序号之前加上***。程序提示输入正确的位置,我们输入0。程序又会提示我们输入我们的crib是明文中的还是密钥中的,假设flag是密钥,就输入key:
这样程序就恢复了一部分明文。在刚才的结果中,不止0一个位置是有意义的,*** 260: "ncryptio"也同样有意义。再次输入ALEXCTF{,输入260作为正确的位置。现在的结果如下:
回到明文开头,我们可以猜测这是一封信的开头,Fri开头的单词很可能是Friend。输入“Dear Friend,”作为crib。得到0: "ALEXCTF{HERE"。
根据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转换成字符串再与字符串XOR
2. 如果猜错了字符,解密出来会出现奇怪的东西,或者不能继续得到有效的字符串,可以回到上一个确定的字符串再次猜测
3.选择解密出的明文时要选择那种可以准确猜测出更多字符的明文字符串
4. 如果对明文和密文都没有信息,可以从常用英文单词开始猜,如“the, it, he, she”, 或者尝试题目中的关键词
5. 如果key或者message里有一个字母大小写错误会导致另一个解密出的大小写相反.