見出し画像

#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

この記事が気に入ったらサポートをしてみませんか?