![見出し画像](https://assets.st-note.com/production/uploads/images/112104690/rectangle_large_type_2_d23eab655cff39392f041d44cb83c5fc.jpeg?width=1200)
#88 Intel Pin
バイナリ解析を行うとき、プログラムの挙動を変えたい場合がでてきます。バイナリなので、単純に書き換えても壊れてしまいます。そこでバイナリ計装というテクニックが必要になります。バイナリ計装には、静的計装(SBI)と動的計装(DBI)の二種類あり、それぞれに特化したフレームワークが存在します。今回は、DBIのフレームワークであるIntel Pinを使ってみます!
Intel Pin
ダウンロード
Intel Pinは、オープソースではありませんが、Intelによって開発、公開されているので、公式サイトからダウンロードできます。
ビルド
ソースに含まれているツールをビルドします。
$ cd source/tools
$ make
ちょっと時間がかかりますが、これでOKです!
テスト用プログラム
テスト用に、Hello Worldプログラムを作成します。
// hello.c
#include <stdio.h>
int main() {
printf("Hello World");
return 0;
}
ビルドします。
$ gcc hello.c -o hello
$ ./hello
Hello World
Pin
source/tools/ManualExamples以下にテスト用のツールがあるので、試してみます。
inscount0は命令数をカウントします。
$ ./pin -t source/tools/ManualExamples/obj-intel64/inscount0.so -- ./hello
$ cat inscount.out
Count 143057
こんなに単純なプログラムでも14万以上の命令があるのですね。
proccountは関数の情報を取得します。
$ ./pin -t source/tools/ManualExamples/obj-intel64/proccount.so -- ./hello
$ cat proccount.out
Procedure Image Address Calls Instructions
...
_fini hello 55742d65616c 1 4
main hello 55742d656149 1 10
frame_dummy hello 55742d656140 1 2
__do_global_dtors_aux hello 55742d656100 1 13
register_tm_clones hello 55742d6560c0 1 10
deregister_tm_clones hello 55742d656090 1 5
_start hello 55742d656060 1 12
.plt.sec hello 55742d656050 1 2
.plt.got hello 55742d656040 1 2
_init hello 55742d656000 1 7
PinのAPIを使えば、自らカスタムツールを実装し、さらに難しいことも実現可能です。
まとめ
バイナリはとっつきにくいですが、Pinのような便利なフレームワークを使えば、少し解析が楽になります。バイナリのまま読めるようになるまでは、がんばります!
EOF