この大会は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}