つけじょにーのすぱげていコード

主に、競技プログラミング、セキュリティのお勉強の際に書いたすぱげていコードを書き込みます

SECCON大阪参加記

10/2にSECCON大阪に行ってきました。 バイナリおいしいというチーム名で参加させていただいて、僕は何も貢献できていなかったのですが、優勝しました。

当日までの準備

SECCON大阪のコンセプト、どうもangrで自動化っぽいんだよなぁと思っていたので、angrでシンボリック実行をやってみる - ももいろテクノロジーの記事を拝見させていただいたり、angrのdocumentを見たり、某キャンプの資料を見たりとして、勉強しました。

当日

まず、競技説明を聞いてビビりまくります。

過去最多問題数 21,672 !!?

テーマ(easy, hardなどの難易度やBOF、Backdoor探しなどテーマで分かれています)ごとの大問が4つあって、大問それぞれでバイナリが一定時間ごと切り替わります。 中には1秒ごと切り替わるものまで・・・ さすがに、セッションが切れていなければその問題は有効となる(1秒ごと切り替わるというのは、1秒経過後、セッションが切られた状態からバイナリを取得しに行こうとすると新しいバイナリになってしまっているということ)。

こういった際、やはり重要だと思われるのはある大問で降ってきた複数のバイナリで異なる箇所はどこか?だと考えたので、そこを念頭に置きながらバイナリをもぐもぐしてました。

するとチームメイトのうさぎさんがスクリプトをぱぱっと作成(!?)し、動かしてみると時折正解するっぽい・・・?

僕のイメージなのですが(間違っている箇所が含まれるだろうということです)、angrではまずELFバイナリを指定してProjectを作成し、path_group(pathというのは、シンボリック解析を行う過程で実行するバイナリの実行状態だと思っています)を作成するところはおおよそ共通して行う部分です。 その後、Constraint(制約)を指定してexplore(探索)します。 ここで、exploreには到達したいゴール、到達したくないはずれのルートを指定することが多いのですが、当日は何も指定せず、全探索で実行していました。

すると当然たくさんの実行パターンがあるのでpath_groupには複数のpathが入ることになるのですが、「Hello World」という文字列が表示された場合は失敗だとわかっている(攻撃が成立しなかった場合の正常動作)ので、そのpathを取り除き、攻撃が成立したと考えられるpathのうち最初に見つかったものを成功と考え、出力からフラグと思しきものを取得して、スコアサーバにSubmitするという感じでした。

僕は3並列でこのスクリプトをガンガン回していた(というか僕ができることってこれくらいだったのでは・・・?泣)のですが、割と安定して競技終了まで動作しており、点数を稼ぐことができたようです。多分。

辛かったこと

難読化辛い・・・ やたらめったらjmpしまくっていたり、and,orなどの論理演算で複雑にしてたりするバイナリがあって、泣きそうになっていました。 バイナリが切り替わるというのは前述の通りなのですが、ロジックが結構切り替わるものもあったらしく、難しかった・・・

思ったこと

今回僕は全然貢献できていないのですが(バイナリおいしいチームが前に行って賞状もらう時も足がガクブル状態になるくらい何もできてないです)、バイナリをちゃんとたべれるようにしたいなと思いました。 katagaitai勉強会が低レイヤーに興味を持ったきっかけで、勉強会後はモチベーションが上がるものの、頭が弱くて解けず、結局あまり取り組めていませんでした。 ですが、セキュキャンをきっかけにまた興味を持ち出して、それが今回参加する動機になりました。

SECCON本選に向けて

貢献できるようにしたい。 そのためにもCTFに積極的に出て精進する! 今まではWeb, Networkが主だったけど、Pwnもできるようにしたい。