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