ISITDTU CTF 2021 Quals Writeup

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

WELCOME (Misc)

Discordに入り、#announcementチャネルのメッセージを見ると、フラグが書いてあった。

ISITDTU{Welcome_t0_ISITDTU_CTF_2021}

ONE TIME BEACH (Cryptography)

制限付きのある長さのキーでXOR暗号化している。拡張子がbinで、データ量も多いので、ASCIIデータではないと推測する。画像データあたりから推測して、復号を試す。PNGでは整合できなかったので、他の形式の画像ファイルかもしれない。次にJPGを試すと、途中まで整合が取れる。他のJPGデータを参考にしながら、復号する。

#!/usr/bin/python3
from itertools import cycle

def xor(a, b):
    return [i ^ j for i, j in zip(a, cycle(b))]

with open('cipher.enc', 'rb') as f:
    cipher = f.read()[20:]

HEADER = b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01'
HEADER += b'\x00\x01\x00\x00\xff\xdb\x00\x43'

c = HEADER[0] ^ cipher[0]
o = HEADER[1] ^ cipher[1]
t = HEADER[2] ^ cipher[2]
h = HEADER[3] ^ cipher[3]
a = HEADER[4] ^ cipher[4]
n = HEADER[5] ^ cipher[5]
_ = HEADER[6] ^ cipher[6]
b = HEADER[22] ^ cipher[22]
r = HEADER[17] ^ cipher[17]
u = HEADER[14] ^ cipher[14]
i = HEADER[23] ^ cipher[23]
s = HEADER[7] ^ cipher[7]
e = HEADER[18] ^ cipher[18]
y = HEADER[9] ^ cipher[9]
key = [c,o,t,h,a,n,_,s,a,y,s,_,y,o,u,_,a,r,e,_,a,_,b,i,t,t,h]

FLAG = xor(cipher, key)

with open('flag.jpg', 'wb') as f:
    f.write(bytes(FLAG))

復号した画像フラグが書かれていた。
f:id:satou-y:20211129212425j:plain

ISITDTU{OMG_1_KNOW_PI_DIGITS}