这道题给了两个文件,一个是加密用的程序,另一个是加密后的文件。加密的方法很简单,就是读plaintext和8 bytes的密码,然后
cipher[i]=key[i%8] ^ (~plain[i])
从文件后缀知道加密的文件是tar.Z格式,但.Z格式搜了下似乎最多3个bytes可以知道,但提示说了密码有8bytes,所以要暴力破解还是有点多……
后来试了下压缩vortex15,这其中compress居然还不在官方源里,要从AUR装ncompress。用
$ tar cf 15.tar vortex15
得到TAR包,然后压缩
$ compress 15.tar
之后我们假定tar.Z文件的起始部分内容应该接近,于是通过XOR得到key的可能值,而且要求key不包含A-Z以外的字符。通过python大概比较了下
#!/usr/bin/pythonimportsysif__name__=="__main__":enc=open(sys.argv[1],"rb").read(64)taz=open(sys.argv[2],"rb").read(64)foriinrange(8):cand=[]forjinrange(8):ch=ord(enc[j*8+i])^(255-ord(taz[j*8+i]))ifch>=ord('A')andch<=ord('Z'):cand.append(chr(ch))print(list(set(cand)))
由magic number of .Z files,前2个bytes确定是ZQ,然后后面的是
['S', 'B', 'K', 'T'] ['Q', 'E', 'D'] ['A', 'Q'] ['D'] ['C', 'B', 'S'] ['A', 'Z', 'J']
这次暴力破解的计算量就小得多了
#!/bin/bashfor i in S B K T;dofor j in Q E D;dofor k in A Q;dofor l in C B S;dofor m in A Z J;doPASS=ZQ"$i$j$k"D"$l$m"echo`./vortex15 vortex15.tar.Z.enc $PASS| uncompress 2>/dev/null | file -`| grep tar
if[$? -eq 0];thenecho"ans is $PASS"exit 0
fidonedonedonedonedone
得到密码,用这个运行vortex15,得到压缩文件,解压后得到congrats.txt