TSG LIVE! 8 CTF Writeup

Revしか解けなかった (& 取り組めなかった) ので、もっと早解きできるように精進していきます。

TSGの皆さま、素晴らしいCTF (+生放送) の企画・運営をしていただき、ありがとうございました!

DNS ROPOB (Rev)

静的解析

静的解析を妨害する目的だと思われるコードが含まれた実行ファイルが配布されます。 冷静に逆アセンブル結果を読んでいくと、入力を所定のキーでXORエンコードしたものと、ハードコードされているバイト列同士をXORエンコードしたものを比較することで、Flagが正しいかどうか検証していることがわかります。 以下のようにFlagを1文字ずつ求めるスクリプトを書けば、Flagが得られます。

ソルバ

enc = [0x12, 0x18, 0x10, 0x48, 0x99, 0x49, 0x49, 0x93, 0x48, 0x59, 0x59, 0xF3, 0xA8, 0xE8, 0x49, 0xD4, 0xC6, 0xB5, 0x68, 0x0A, 0x8C, 0x85, 0x96, 0xE7, 0xF8, 0x69, 0x57, 0x43, 0xA3, 0x76, 0x8D, 0x7C]
seed = [0x37, 0x28, 0x26, 0x68, 0xBC, 0x6C, 0x43, 0xB9, 0x66, 0x5B, 0x45, 0xCF, 0xB0, 0xE5, 0x4B, 0xC7, 0xDE, 0xA4, 0x7C, 0x0D, 0xA2, 0x80, 0x95, 0xEB, 0xE4, 0x55, 0x74, 0x6F, 0x82, 0x5A, 0xBE, 0x62]

flag = ''
key = [0x63, 0x71]

for i in range(0x20):
    flag += chr(enc[i] ^ seed[i] ^ key[(i+1)%2])

print(flag)