SECCON 2016 Online CTF Writeup

この大会は2016/12/10 15:00(JST)~2016/12/11 15:00(JST)に開催されました。
今回もチームで参戦。結果は2000点で930チーム中37位でした。
自分で解けた問題をWriteupとして書いておきます。

Vigenere (Crypto 100)

Vigenere暗号の問題。平文の最初7文字が"SECCON{"で鍵が12文字あることが分かっている。まず鍵の最初7文字を求める。

al_l = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}'

c = 'LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ'
p = 'SECCON{'

key = ''

for i in range(len(p)):
    index = al_l.index(c[i]) - al_l.index(p[i])
    if index < 0:
        index += len(al_l)
    key += al_l[index]

print key

実行すると、鍵の最初7文字が"VIGENER"であることがわかる。次の文字は"E"であると想定して、4文字のブルートフォースで問題に記載してあるハッシュ値になるものを探す。

import hashlib
import itertools

al_l = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}'

c = 'LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ'
k = 'VIGENERE'
k_size = 12

for s in itertools.product(al_l, repeat=4):
    key = k + ''.join(s)
    print key
    p = ''
    for i in range(len(c)):
        index = al_l.index(c[i]) - al_l.index(key[i%k_size])
        if index < 0:
            index += 28
        p += al_l[index]
    if p[-1:] == '}':
        if hashlib.md5(p).hexdigest() == 'f528a6ab914c1ecf856a1d93103948fe':
            print p
            break
SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}