ASIS CTF Quals 2018 Writeup

この大会は2018/4/29 3:00(JST)~2018/5/1 3:00(JST)に開催されました。
今回もチームで参戦。結果は541点で736チーム中63位でした。
自分で解けた問題をWriteupとして書いておきます。

Welcome (Trivia)

Twitterで@ASISCTFがフラグをツイートしている。

ASIS{Welcome_to_ASISCTF_Let's_increase_the_world's_entropy}

The Early School (Crypto)

暗号の処理は以下のイメージ。

FLAGを2進数にする。

FLAGの2進数の長さが79の場合
msg[0] + msg[1] + msg[0] ^ msg[min(1, 78)]
msg[2] + msg[3] + msg[2] ^ msg[min(3, 78)]
msg[4] + msg[5] + msg[4] ^ msg[min(5, 78)]
         :
msg[78] + msg[78] ^ msg[min(79, 78)]

roundの回数だけ繰り返す。

元の平文も含まれているので、復号はそれほど難しくない。

from Crypto.Util.number import *

def decrypt(msg):
    dec = ''
    for i in range(0, len(msg), 3):
        if (i + 2) < len(msg):
            assert int(msg[i]) ^ int(msg[i+1]) == int(msg[i+2])
            dec += msg[i:i+2]
        else:
            assert int(msg[i+1]) == 0
            dec += msg[i:i+1]
    return dec

with open('FLAG.enc', 'rb') as f:
    data = f.read()

ENC = bin(bytes_to_long(data))[2:]

i = 1
while True:
    try:
        print 'Round %d' % i
        ENC = decrypt(ENC)
        i += 1
    except:
        break

while True:
    if len(ENC) % 8 == 0:
        break
    ENC = '0' + ENC

FLAG = ''
for i in range(0, len(ENC), 8):
    FLAG += chr(int(ENC[i:i+8], 2))

print FLAG
ASIS{50_S1mPl3_CryptO__4__warmup____}