SECCON 2019 Online CTF Writeup

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

coffee_break (crypto)

暗号化処理の概要は以下の通り。

・key1でencrypt関数実行→enc1
・key2を0x00でパディングした鍵でenc1(パディング)をAES-ECB暗号化

鍵が分かっているので、enc1まで復号するのは簡単にできる。encryt関数は少々複雑だが、1文字ずつ暗号化しているので、ブルートフォースで元の平文を求める。

from Crypto.Cipher import AES
import base64

def encrypt(key, text):
    s = ''
    for i in range(len(text)):
        s += chr((((ord(text[i]) - 0x20) + (ord(key[i % len(key)]) - 0x20)) % (0x7e - 0x20 + 1)) + 0x20)
    return s

def unpad(s):
    return s[:-ord(s[-1])]

key1 = "SECCON"
key2 = "seccon2019"

enc = 'FyRyZNBO2MG6ncd3hEkC/yeYKUseI/CxYoZiIeV2fe/Jmtwx+WbWmU1gtMX9m905'
cipher = AES.new(key2 + chr(0x00) * (16 - (len(key2) % 16)), AES.MODE_ECB)

enc1 = unpad(cipher.decrypt(base64.b64decode(enc)))

flag = ''
for i in range(len(enc1)):
    for code in range(32, 127):
        try_flag = flag + chr(code)
        try_enc = encrypt(key1, try_flag)
        if try_enc[i] == enc1[i]:
            flag += chr(code)
            break

print flag
SECCON{Success_Decryption_Yeah_Yeah_SECCON}