这道题给了两个文件,一个是加密用的程序,另一个是加密后的文件。加密的方法很简单,就是读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/python
import sys
if __name__ == "__main__":
enc = open(sys.argv[1],"rb").read(64)
taz = open(sys.argv[2],"rb").read(64)
for i in range(8):
cand = []
for j in range(8):
ch = ord(enc[j*8+i]) ^ (255-ord(taz[j*8+i]))
if ch>=ord('A') and ch<=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/bash
for i in S B K T; do
for j in Q E D; do
for k in A Q; do
for l in C B S; do
for m in A Z J; do
PASS=ZQ"$i$j$k"D"$l$m"
echo `./vortex15 vortex15.tar.Z.enc $PASS | uncompress 2>/dev/null | file -` | grep tar
if [ $? -eq 0 ]; then
echo "ans is $PASS"
exit 0
fi
done
done
done
done
done
得到密码,用这个运行vortex15,得到压缩文件,解压后得到congrats.txt