IJCTF 2020 Writeup

この大会は2020/4/25 19:30(JST)~2020/4/27 1:00(JST)に開催されました。
今回もチームで参戦。結果は 620点で144チーム中77位でした。
自分で解けた問題をWriteupとして書いておきます。

Plain-t.. uh Image (Crypto)

jpgのフォーマットを考えながら、少しずつ平文が判明した部分のXOR鍵を求める。40バイト分見つかったら、復号できる。

def str_xor(s1, s2):
    return ''.join(chr(ord(a) ^ ord(b)) for a, b in zip(s1, s2))

with open('flag.jpg.enc', 'rb') as f:
    enc = f.read()

key = ''
JPG_HEAD = '\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01'
key += str_xor(enc[:len(JPG_HEAD)], JPG_HEAD)

DATA1 = 'ghijstuvwxyz'
key += str_xor(enc[0x19c:0x19c+len(DATA1)], DATA1)

DATA2 = 'Zcdefghijstuvwxy'
key += str_xor(enc[0x270:0x270+len(DATA2)], DATA2)

flag = ''
for i in range(0, len(enc), 40):
    flag += str_xor(enc[i:i+len(key)], key)
    #flag += enc[i+len(key):i+40]
    #flag += '*' * (40 - len(key))

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

f:id:satou-y:20200428211610j:plain

ijctf{l0ng_k3Y_Doe5nt_me4n_s3cur3}