STEM CTF: Cyber Challenge 2018 Writeup

この大会は2018/4/21 8:00(JST)~2018/4/22 8:00(JST)に開催されました。
今回もチームで参戦。結果は2600点で229チーム中6位、Professionalでは1位でした。
自分で解けた問題をWriteupとして書いておきます。

Keyboard Shuffle (Crypto 100)

問題の暗号は以下の通り。

Ut awwna U;n cwrt vS r rtoubfm rgBJAB DIE VWUBF AI YBSWEARndubf BTQt~ nxPRTOUBF)UA)ooEWBRKT)Ges{

英語のキーボードで本来の左側を押してしまっていることが多いようだ。
正しくキー操作しているときと、CAPS Lockを押している可能性に気をつける(aを押すべき時にCaps Lock押してしまっているときがある)。特に大文字小文字が入れ替わっているときはaを押している可能性がある。
正しい入力にすると以下のような感じになるはず。

It seems I'm very bad at typing, thanksn for being so understanding anyway! MCA{TYPING_IS_APPARENTLY_HARD}
MCA{TYPING_IS_APPARENTLY_HARD}

Blue Codes of Death (Crypto 200)

FLAGの各文字について以下の処理を行う。

md5(salt + c + idx(0-19))
※saltは2**16未満の数値文字列

このハッシュ値を2バイトごとに青の数値として32x32の画像に入れていく。この処理をFLAG20バイト分行っている。
画像からハッシュ値がわかるので、saltとFLAG文字をブルートフォースで探り当てる。

from PIL import Image
import hashlib

img = Image.open('release.png').convert('RGB')

flag = ''
for i in range(20):
    h = ''
    for y in range(0, 32, 8):
        for x in range(i*32, (i+1)*32, 8):
            r, g, b = img.getpixel((x, y))
            h += '%02x' % b

    found = False
    for salt in range(2**16):
        for code in range(32, 127):
            text = str(salt) + chr(code) + str(i)
            myhash = hashlib.md5(text).hexdigest()
            if myhash == h:
                found = True
                flag += chr(code)
                print chr(code),
                break
        if found:
            break

print
print flag
MCA-27c0384c33a93172