この大会は2019/3/8 18:00(JST)~2019/3/9 18:00(JST)に開催されました。
今回もチームで参戦。結果は1473点で241チーム中34位でした。
自分で解けた問題をWriteupとして書いておきます。
crypto_warmup (Warmup)
5種類のワードがたくさん出てくる。5進数で1行1文字になるのかもしれない。Aeroで始まることを前提に数字を割り当てる。
kappa_pride -> 2 pepe -> 3 kappa -> 0 look_at_this_dude -> 4 trollface -> 1
with open('meme_or_not', 'r') as f: lines = f.readlines() nums = {'kappa': '0', 'trollface': '1', 'kappa_pride': '2', 'pepe': '3', 'look_at_this_dude': '4'} flag = '' for line in lines: words = line.strip().split(' ') base5 = '' for word in words: base5 += nums[word] code = int(base5, 5) flag += chr(code) print code print flag
Aero{7a911ccfb18c2fafe2960b6ee2cbc9c7}
gocryptor (Crypto)
go言語で暗号処理が書かれているが、16バイトのキーのXOR暗号であることがわかる。
繰り返す16バイトのデータを参考に鍵を予測する。jpgとわかるので、調整しながら復号する。
with open('example_drawing.enc', 'rb') as f: enc = f.read() key = '\x72\xb5\x39\xC7\xA3\xe2\x39\x15\x37\x44\x5b\x2b\x87\x6e\x23\x20' dec = '' for i in range(len(enc)): code = ord(enc[i]) ^ ord(key[i%len(key)]) dec += chr(code) with open('example_drawing.jpg', 'wb') as f: f.write(dec)
画像の右下に小さくフラグが書いてある。
Aero{9e57f6b3509283933c1be3fedda555b6}
damaged ticket (Code)
画像を縦切りにしたファイルが600個。ファイル名は0~599のmd5と推測。順に結合していく。
from PIL import Image import hashlib DIR = './parts/' OUTPUT_WIDTH = 600 OUTPUT_HEIGHT = 267 output_img = Image.new('RGB', (OUTPUT_WIDTH, OUTPUT_HEIGHT), (255, 255, 255)) for x in range(600): num = '%d' % x file = DIR + hashlib.md5(num).hexdigest() + '.png' input_img = Image.open(file) output_img.paste(input_img, (x, 0)) output_img.save('flag.png')
画像にフラグが書いてある。
Aero{2c5afcd62a5851f744fd6adb60ae2345}