Aero CTF 2019 Writeup

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

f:id:satou-y:20190311200302j:plain
画像の右下に小さくフラグが書いてある。

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')

f:id:satou-y:20190311200452p:plain
画像にフラグが書いてある。

Aero{2c5afcd62a5851f744fd6adb60ae2345}