Midnight Sun CTF 2019 Finalにdcuaで参加し、14チーム中8位でした。 チームメンバーにpwnerがいたので私はrevとhardwareを中心に取り組みました。 いろんな人とお話できて楽しかったです。
取り組んだ問題たち:https://bitbucket.org/ptr-yudai/writeups/src/master/2019/Midnight_Sun_CTF_2019_Finals/
大会概要
旅費は一人$600まででした。 金曜日の朝に成田空港を出て金曜日の午後にストックホルムに付きました。 久しぶりに長時間の飛行機に乗りましたが、やっぱり映画が楽しいです。 あとFinnairの機内食が予想以上においしかったです。
空港からホテルまでは電車とバスで1時間半以上かかります。 ホテルが思ったよりしょぼくて、次のような面白要素がありました。
- 周りにピザ屋1軒以外に食料調達できる店が無い
- 部屋に歯ブラシやフェイスタオルなどが無い
- 冷蔵庫は無いが電子レンジがある
- 会場まで遠い(駅まで徒歩15分)
なんでここにホテル建てたんだ?って思うほど周りに何もなかったです。
大会の会場は学校で、外部へのインターネットアクセスやWiFiもあったので良かったです。 また、各種飲み物や食べ物が好きなだけ貰えるのも良かったです。 大会は24時間なのですが、ホテルには帰らず会場に24時間いなければなりません。 一応寝るスペースはありましたが、つらかったです。
問題
今後参加する方のために、取り組んだ問題の概要をまとめます。
Crypto
私とふるつきでRSA問2つを挑戦したのですが、いずれも解けませんでした。 1つ目(RZA)はN, Cと不動点Mが渡されて、Cを解読する問題です。ほとんどのチームは解けてました。 2つ目(RZA2)は素数qがpに依存して作られている問題で、適当に近似してCopper Smith's Attackを試しましたが解けませんでした。 他のチームの人に聞いたところ、ビット数が足りないのである程度ブルートフォースする必要があったらしいです。
Web
web問は基本的にst98さんが解いてくれましたが、heavensdoorという問題だけは解きました。 なんかURLに10個数字を入れると何かの関数に渡されて計算結果が返ってくるのですが、これとunix timeが一致すればフラグが得られます。 ブラックボックスで各引数を変えながら関数の式を大まかに予想していって解きました。 全然web問じゃなかったです。
Rev
私は2つ挑戦してどちらも解けました。
1つ目(revlutionary)はフラグをチェックするバイナリで、終端文字がNULLであることを利用すれば逆から計算できます。
やってることは1文字目の文字コードがXXなら buf[0x2aXX]
を参照し、次に2文字目がYYなら buf[0xXXYY]
を参照する、という風になっています。
buf上にNULLは3つだけ存在し、そのうち1つは0xAABBのBBの部分が }
の文字コードと一致したためそこから逆算しました。
2つ目(shaken-and-stirred)は入力を暗号化するバイナリで、1バイトごとのストリーム暗号っぽかったです。 1文字ずつ総当りしたいのですがバッファをごちゃごちゃする処理にすごい時間がかかるので、処理後のバッファをダンプして、それを予め使うようにバイナリを改造してから総当りしました。 バッファをスクランブルした後にもちょっとだけ処理があるので、バッファを書き換えるだけでなく、その処理が上手く再現できる命令も用意する必要があります。 ちなみにフラグにRC4と書いてあったので、そういうことらしいです。
Hardware
3つHardware問題があり、これは別の部屋に行って解くことができます。私は1つだけ解きました。 1つ目(Devious Digital Device)はXORゲートをたくさん使った回路で、左にマトリクスLEDがあり、右にシフトレジスタと16個のLEDが並んでいます。 適当に入力を変えるとマトリクスLEDがそれとなくQRコードっぽいことが分かりました。 そこで、ファインダパターンなど固定のモジュールを観測し、それが正しく光る/消える状態になるような入力を1ビットずつ調べ、正しい入力を特定しました。 現れたQRコードをデコードするとフラグになりましたが、実はそれは罠でそのフラグを運営に見せると正しいフラグが貰えました。(なんで?)
2つ目(GB Calc)はゲームボーイの問題で、実機のゲームボーイとカセットに入っているROMが渡されます。 動かすと電卓なのですが、イコールを押すとスタックの値が書き換わるようで、何回も連続してイコールを押すことでスタックの値をいくらでも上書きできます。 canaryが付いているので適当にやるとstack smashing detectedと表示されて終わるのですが、ROMを逆アセンブルするとcanaryは固定で0x5858でした。 なのでリターンアドレスを書き換えることでPCを取れるのですが、フラグを表示するような関数が見つからず解けませんでした。 解いたチームの方に聞いたところ、ゲームオーバー画面でフラグ用のパレットが生成されるようで、それを構成してから表示させてやればフラグが現れたようです。
3つ目(Measurement For Realz)は相関電力解析の問題っぽかったです。 AESの回路とオシロスコープを使って電力を測定するところからやるのですが、オシロスコープとの通信が上手くいかなかった上、使える時間が限られていたので断念しました。 この問題は唯一誰も解いてませんでした。