vortex14

Posted by rk700 on September 18, 2014

这道题提供了一个文件,是hexdump了server和client的通信

首先根据<和>的个数及前后字符,我们判断出通信的流程是:server->client, client->server, server->client。这是因为我估计当<或>前面是换行(\x0a),后面是空格时,才代表通信;否则是密文

开始想着是不是在第一次server把key传给client(应该是两个dash后面的部分),然后简单地做异或与。但试了下不对。但观察后两次通信内容,每个对应字符的最高位都是同为0或同为1,这说明后两次通信很有可能是用同样的key做异或与的,但就是不知道算法……

后来在看一篇APT的介绍中提到他们用RC4来加密通信,于是试了下,果然是RC4……

从hexdump恢复文件,用xxd:

$ xxd -r overthewire/vortex/vortex14.txt > vortex14

然后可以通过head与tail结合打印某一行,比如第二行:

$ head -2 vortex14 | tail -1 | hexdump  -v -e '"\\""x" 1/1 "%02x" ""'`

python2里有crypto的库。但两次decrypt用的是各自的crypto,因为根据RC4的定义,一旦开始解密,S盒的内容也会被改变

#!/usr/bin/python2

from Crypto.Cipher import ARC4

if __name__ == '__main__':
key = "\x50\xdb\x5b\x09\x6c\xce\xf6\x98"
crypto1 = ARC4.ARC4Cipher(key)
crypto2 = ARC4.ARC4Cipher(key)
ctext1 = "\xfb\x76\x3e\x64\xd3\x72\x94\x8f\xa6\xa9\x4d\x43\xc8\xa4\x85\xb8\x09\xc6\xc2\xfa\x69\x51\x96"
ctext2 = "\xfb\x76\x3e\x64\xd3\x72\xab\xbf\x93\x8f\x64\x21\xae\xd8\xe3\xbe"
print(crypto1.decrypt(ctext1))
print(crypto2.decrypt(ctext2))

得到明文