Eyes, JAPAN Blog > radiff2を使ってバイナリパッチを作る

radiff2を使ってバイナリパッチを作る

Takeyuki Sato

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

バイナリパッチとは

例えば、あるオンラインゲームのアップデートをするときなどソースコードをダウンロードしてくるよりその差分のバイナリにした方が効率的です。そのような、バイナリを直接目的のバイナリに変更する修正をバイナリパッチと言います。

 

radiff2とは

radiff2はradare2という静的解析ツールのサイドツールとして開発されています。radiff2でなくてもバイナリパッチツールは既存ですがradare2と共に使えるのでゲーム解析する人やCTFをやっている人には便利なのではないでしょうか。例えば、セーブデータなんかは興奮しますね!申し訳ありませんが、インストールは説明しません。

 

適当なバイナリを2つ用意し差分を取ってみる

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-30-6-20-03

「hello」と出力するやつと「world」と出力するプログラムの差分を見てみたいと思います。

$ radiff2 [バイナリファイル] [バイナリファイル]

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-30-6-22-05

三箇所ほど差分が取れました。オフセット+変更値のようになっています。

するとファイルの先頭から0x00005c4のところで48656c6f(hello) => 776f7264(world)の差分が取れたことがわかります。

さて、差分がわかりましたら通常だとhexエディタかスクリプトを書いて変更しますが変更する値が多かったりしたら大変です。今回はradare2を使って変更してみたいと思います。

 

パッチファイルを作る

radiff2はradare2用のコマンドを吐き出します。それをパッチファイルとして保存して適用してみましょう。

$ radiff2 -r hello world

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-30-6-33-22

rオプションをつけてパッチファイルを生成します。wxはradare2の書き込みを意味します。このスクリプトファイルをradare2で実行します。

$ r2 -w -i patch hello

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-30-6-39-13

radare2が起動します。helloにパッチを当てました。簡単ですね。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-30-6-40-31

wオプションは書き込み、iオプションはスクリプトファイルを指定できます。もっと細かいパッチも作れます。

確認してみましょう!

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-30-6-51-29

変更されています。

 

まとめ

時々、構造も用途もわからないバイナリファイルに出くわすことがあります。そのとき、動的解析によりバイナリファイルの変更を監視したり自分で変更したりすると色々わかってくることもあります。「差分」は、解析の大きなヒントになると言えるでしょう。

Comments are closed.