日目として書かれた記事です。残しておこうと思います。問題が一切なかったのとで、僕は地蔵をしていただけでした1。いう形式の大会で、アタックポイントとディフェンスポイントの合計が高いチームの勝利となります。度でも攻撃に成功すれば得られるポイントのことで、ディフェンスポイントとは攻撃成功の証を攻撃対象のサーバ中に残し続けることにより、一定時間おきに得られるポイントのことです。直感的にはいくつかあるサーバに対して攻撃を試みることで点がもらえる、またそのサーバを「占領」することによっても点がもらえる、という感じです。問題により構成されていました。このような競技の形式上、ディフェンスポイントを継続して取り続けられるかどうかが非常に重要になってきます。日目はまたディフェンスポイントの取れる問題に時間を割く、という流れで競技時間を使いました。するなどしていました2。ボードが各チームに配布されました。書かれたプログラムを解析すればよいみたいです。そこでひとまずこの文字列をバイナリファイルに変換してしまいましょう。そこでまずは簡単な表層解析でもして、フラグのありかへのあたりをつけ、静的解析をサボる方法でも探してみることにしましょう。デバイスはマウスとして振る舞い、起動すると何らかのマウス操作を通してフラグを表示するのでしょう。そこで適当なペイントソフトウェアを起動し、そこにカーソルを置いた上で、解析対象を適当なマシンに差し込んで動かしてみることにします。始め描画されて、その後カーソルの動きが遅くなります。この結果からは次のような推測ができます。ファームウェアダンプ中には簡単な画像ライクなファイルが埋まっているのかもしれない。全ての文字を描画するためには相当な時間を要するだろう。コマンドあたりで探せば出てくるかもしれません。DESCRIPTION--------------------------------------------------------------------------------おっと、何もありません。少なくとも適切なファイルヘッダのついた画像ファイルは埋まっていなさそうです。なんだかある程度は静的解析をしないといけなさそうです。書かれたプログラムを解析していくことにします。適切な設定を施して、ファームウェアダンプをロードしてあげます。デコンパイラが大嘘を言っている気がしたので、あまりデコンパイラの出力は信じずに解析していました。デコンパイラの出力を用いて説明をしていきます。推測ベースで読むまずはエントリーポイントを適当に探します。すると始めは以下のような処理に飛びそうなのが分かります。あたりが本質的な処理でしょう。ループに入っています。ループでマウスの移動のような処理が進むのでしょう。次はこれを解析してみます。return;}見るに堪えないデコンパイル結果ですね。箇所くらいあることが分かります。呼ばれていることも分かります。箇所は以下のような形で並んでいます。いうものだったことを思い出しましょう。このような挙動は次のように書き下すことが出来ます。マウスの変位等を調整していそうな感じがします3。つのシンボルは連続した領域を指しています。処理はマウス移動操作間の時間を制御しているはずです。そこでこの関数も解析してみることにします。値が鍵となっています。この関数は時間系のものであることが分かります。値を使って生成された適当な時間の間処理を止める、という処理に見えます。生成処理が「フラグの描画が進むにつれてカーソル移動が遅くなる」という挙動を実現していそうです。比較ベースで解析するここまでの解析を通して、だいぶプログラムの構成が見えてきました。制御している箇所も、ある程度推測がついています。ここまでの解析では勘に頼ってしまっています。マウスのどのような制御に使われているのかは、全く分かっていません。マウスとして利用するときに使われるライブラリを読みながら、また実際に自分でも同じようなプログラムを書きながら、より精緻な解析をしてみることにします。見てみると、ここにはマウスカーソルの移動を実現するための関数が幾つか置いてあります。ような関数がそれに当たります。書き込みを行っていたのでした。スクロールの制御を行っているとみて間違いなさそうです。このようにして、実際にライブラリのソースコードと見比べたり、実際に自分で作ってみたシンボル情報付きのバイナリと見比べたりしながら解析を進めることで、ここまでの推測が妥当であることを確認していきました。始めから推測に自信を持っていたわけではなく、解析にかけた時間の殆どは、このような既存のコードとの照らし合わせ作業です。パッチを当てるさて、解析はある程度できてきました。完璧に解析が出来ているという自信があれば、先程のマウスの制御処理を再現するスクリプトを手元で書いてみてもよいでしょう。そのような作業はしばしば退屈で、かつバグらせると面倒です。ボードに書き込み、走らせてみることにします。以下のようにして生成されていたのでした。...)なんだか適当にこの辺の処理を破壊してやれば良さそうです。たちの条件式が何を意味しているのかはあまり理解していません。