vortex15

Posted by rk700 on September 21, 2014

这道题给了两个文件,一个是加密用的程序,另一个是加密后的文件。加密的方法很简单,就是读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