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