ごちゃごちゃしたIT勉強記録

自分用メモ。主にセキュリティで、その他色々書きたい。

動的バイナリ計装(Dynamic Binary Instrumentation)を調べたりしてみた

CODE BLUEのトレーニングにあったDBIというものがちょっと面白そうだったので、調べたりしてみました。
レーニング自体参加したかったのですが、仕事の関係で参加できず。
codeblue.jp

ただ、調べたり論文みたりしてみたらかなり便利そう(特にマルウェア解析するときには効率良くなりそう)と思ったので、わからないことは多いけど少しまとめてみます。

動的バイナリ計装(DBI : Dynamic Binary Instrumentation)とは

論文とかをみてみると、下のようにまとめられるかな、と。

  • プログラムの動的解析の手法
  • 実行中のプログラムにコードを挿入(コードは解析者があらかじめ準備)
  • プログラム内の情報(APIの関数名、設定された引数など)を明らかにできる

日本語で書かれた記事については下の参考URLをみてほしいのですが、英語の記事でまとまってそうなのはこちら。
Dynamic Binary Instrumentation Primer

やってみる!

今回は、上の中でもDynamoRIOを使ってみたいと思います。とりあえずの取っ掛かりとしてはつかいやすそうだったのが理由です。
ダウンロードしたzipを展開して、コマンドを実行すれば色々情報が取れそうな感じです。
今回試してみる環境はこちら

環境

  • ホストOS : Windows7 64bit
  • 仮想環境 : VMware Workstation 12 Pro
  • ゲストOS : Windows10 64bit
  • DynamoRIO version : 7.0.0-RC1(DynamoRIO-Windows-7.0.0-RC1.zipをダウンロード)

ゲスト環境にDynamoRIOを展開して、色々やってみます。

System Call Tracer

Windowsにおけるシステムコールをトレースすることができます。呼び出されたシステムコール、設定された引数がログとしてファイルに出力されます。
以下のコマンドで電卓(calc.exe)をトレースすると、以下のような結果が得られます。

drrun.exe -t drstrace -- calc
NtQueryVirtualMemory
	arg 0: 0xffffffff (type=HANDLE, size=0x4)
	arg 1: 0x008c2980 (type=void *, size=0x4)
	arg 2: 0x2 (type=int, size=0x4)
	arg 3: 0x02d1fca4 (type=<struct>*, size=0x4)
	arg 4: 0x212 (type=unsigned int, size=0x4)
	arg 5: 0x00000000 (type=unsigned int*, size=0x4)
    succeeded =>
	arg 3: <NYI> (type=<struct>*, size=0x4)
	arg 5: 0x00000000 (type=unsigned int*, size=0x4)
	retval: 0x0 (type=NTSTATUS, size=0x4)
NtQueryInformationProcess
	arg 0: 0xffffffff (type=HANDLE, size=0x4)
	arg 1: 0x24 (type=int, size=0x4)
	arg 2: 0x02d1fc78 (type=<struct>*, size=0x4)
	arg 3: 0x4 (type=unsigned int, size=0x4)
	arg 4: 0x00000000 (type=unsigned int*, size=0x4)
    succeeded =>
	arg 2: <NYI> (type=<struct>*, size=0x4)
	arg 4: 0x00000000 (type=unsigned int*, size=0x4)
	retval: 0x0 (type=NTSTATUS, size=0x4)
.......

Library Tracing Tool

呼び出されたライブラリコールをトレースして表示してくれます。
以下のコマンドでメモ帳(notepad.exe)をトレースすると、以下のような結果が得られます

drrun -t drltrace -only_from_app -- notepad
~~~~ KERNEL32.dll!GetStartupInfoA(0x007dfbfc, 0x595d088d)
~~~~ KERNELBASE.dll!GetModuleHandleA(0x00000000, 0x007dfbdc)
~~~~ msvcrt.dll!__set_app_type(0x00000002, 0x00000002)
~~~~ msvcrt.dll!__p__fmode(0x00e2a63a, 0x007e0000)
~~~~ msvcrt.dll!__p__commode(0x00e2a63a, 0x007e0000)
~~~~ msvcrt.dll!_controlfp(0x00010000, 0x00030000)
~~~~ KERNELBASE.dll!SetUnhandledExceptionFilter(0x00e2a880, 0x00e2a63a)
~~~~ msvcrt.dll!_initterm(0x00e11328, 0x00e11340)
~~~~ msvcrt.dll!__getmainargs(0x00e2c7e8, 0x00e2c7ec)
~~~~ msvcrt.dll!_onexit(0x00e2af40, 0x595d0f49)
~~~~ msvcrt.dll!_onexit(0x00e2af60, 0x595d0f49)
~~~~ msvcrt.dll!_ismbblead(0x0000006e, 0x595d088d)

かっこ内で表示されているのは、ライブラリコールの際に設定された引数の一部っぽい?

まとめ

ぶっちゃけまだ勝手がよくわからんと言う感じ。
ただ、「どんなライブラリコールがされたのか」「どういった順番でよばれたか」がわかる感じなので、ちゃんとツールの特徴とかを把握できればマルウェア解析とが少し楽になりそうと言う感想。
他にも色々ツールがあるので試してみたいのと、ちゃんと「DBIってなに」というのを勉強しようと思う。
特に、セキュリティ系の論文は結構読んでて面白いなぁと思うことがよくあるので、これからも色々読んで試せるものがあれば試してみたいと思います。

【参考URL】
PinからPEMUへ | 一生あとで読んでろ
Intel Pinを使ってみる - ももいろテクノロジー
PEMUを動かしてみる - 拾い物のコンパス
Windows 10でDynamoRIOを使ってみた - SENTO NO OBOEGAKI