wivern ロゴ

サイバーセキュリティ研究所

サイバーセキュリティを中心に、軍事、防犯、サーバーの管理と監視、その他、最新技術を研究しています。


「たのしいバイナリの歩き方」勉強メモ#1

リバースエンジニアリングでバイナリの読み方を身につける

「たのしいバイナリの歩き方」#1

CTFの勉強の手始めとして、「たのしいバイナリの歩き方」を読み始めたので、章ごとに読書メモとして残しておきたいと思います。
本書を読んで勉強している人の参考になれば幸いです。
実行環境は、Windows7(64bit版)です。

本書掲載のサンプルファイルはこちらからダウンロードできます。

1.1 まずは解析の流れを体感してみよう
各種ツールのダウンロードURL。

[Stirling:バイナリエディタ] v1.31
http://www.vector.co.jp/soft/win95/util/se079072.html

[Process Monitor:ファイルとレジストリの監視] v3.10
http://technet.microsoft.com/ja-jp/sysinternals/bb896645.aspx

[Wireshark(ネットワークの監視)] v1.12.0
http://www.wireshark.org/
http://sourceforge.jp/projects/wireshark/

0.exeと1.exeはコピーされていましたが、レジストリへの書き込みは確認できませんでした。

[確認したレジストリ]
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce

ソフトウェアを解析し、動作を解明していくことを「リバースエンジニアリング」と呼ぶ。

コラム:リバースエンジニアリングの技術力を競う大会
SECCON CTF(日本)
DEFCON CTF(アメリカ)
CODEGATE CTF(韓国)

1.2 静的解析をやってみよう
静的解析:対象となるプログラムを実行せずに解析する
動的解析:対象となるプログラムを実行しながら解析する

筆者個人としては、バイナリエディタ、電卓、逆アセンブラ、デバッガがリバースエンジニアリングにおいて必須アイテムだと感じている。
「PEフォーマット」:Windowsの実行ファイル形式にならったデータ列
リバースエンジニアリング:「ソースコードなどが一切ない状態から、そのソフトウェアの動作を把握する」

IDA 6.2 Demo version, IDA 5.0 Freeware version

IDA Pro Free の実行時に、こんなエラーが発生しました。
IDA Pro Free 実行時のエラー画面

対処法としては、idag.exeのプロパティ画面を開いて、互換性タブの「特権レベル」の「管理者としてこのプログラムを実行する」にチェックを入れます。
IDA Pro Free のプロパティ画面

Names Windowに「wWinMain」が見当たりませんでした。

1.3 動的解析をやってみよう
動的解析:対象のプログラムを実行しながらその動作を追うこと
     ファイルやレジストリアクセスのログを取得する
     ネットワークのパケットをキャプチャする

ステップイン:関数内部まで入り込んで実行する
ステップアウト:関数の呼び出しそのものを1命令として実行する

OllyDbg
OllyDbg1.10用日本語化パッチ

OllyDbgの日本語化がめんどくさい。(本書p.281-283参照)
まだ完全には日本語化できていなくて、ウィンドウの文字が化けている。

0x00401000以降の逆アセンブル結果が微妙に異なる。
[例]00401008 [本]CALL wsample0._chkstk→[実際]CALL wsample0.004018E0
→シンボルが解決できてない?

OllyDbg ショートカット
F2:ブレークポイントのセット
F7:ステップイン
F8:ステップアウト
F9:実行

コラム:レジスタとは
レジスタ:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI,EIP
フラグレジスタ:CF,PF,AF,ZF →主に条件分岐で使用される
基本的には、レジスタとフラグレジスタを知っていれば、ソフトウェアの解析はできる。

静的解析は「全体を広く眺めるイメージ」、動的解析は「局所的に集中して見つめるイメージ」。

とりあえず最初にStirlingやIDAで全体をざっと眺めたあとに、気になったポイントをOllyDbgでステップ実行していく、といった流れで解析することが多い。

コラム:好みのデバッガを選ぼう
Immunity Debugger
WinDbg(32ビット版)
WinDbg(64ビット版)

カーネルランドで動作するプログラムのデバッギングに対応しているのはWinDbgだけ。
Rootkitのような、Windowsカーネルで動作するマルウェアを解析する場合は必要。

WinDbg(64ビット版)のインストールでかなり手間取ったので記録しておきます。
環境は、Windows7(64ビット版)です。
※第2章でダンプファイルを開くところ(p.88)で、WinDbg が必要になります。

64 ビット版 Debugging Tools for Windows
から、Windows SDK(winsdk_web.exe) ダウンロードして実行します。

WinDbg インストール(1)
「Next >」をクリック

WinDbg インストール(2)
「I Agree」を選んで「Next >」をクリック

WinDbg インストール(3)
「Next >」をクリック

WinDbg インストール(4)
「Next >」をクリック

WinDbg インストール(5)
「Debugging Tools for Windows」がチェックされていることを確認して「Next >」をクリック
WinDbg インストール(6)
「Next >」をクリック

WinDbg インストール(7)

と、これでインストールできるハズなんですが、私の環境では「Debugging Tools for Windows (x64)」がインストールされていませんでした。

再度試してみましたが結果は同じなので、インストールの最後の画面で「View Log」をクリックしてインストールログを確認すると、「vcredist_x64.exe installation failed with return code 5100」と記録されていて、インストールが失敗していました。

いろいろとネットで解決策を探してみたところ、

Microsoft Visual C++ 2005 Redistributable
Microsoft Visual C++ 2008 Redistributable
Microsoft Visual C++ 2010 Redistributable

を(x86もx64も全て)アンインストールすると解決するとあったので、それも試してみましたが、それでもダメ

結局、インストールするコンポーネントを選ぶ画面(5番目の画面)で、「Debugging Tools for Windows」だけを選んでインストールする(「.NET Development」の「Intelisense and Reference Assemblies」も自動で選択される)とウマく行きました。

ちなみに、32ビット版の WinDbg を追加インストールしたい場合は、
C:\Program Files\Microsoft SDKs\Windows\v7.1\Redist\Debugging Tools for Windows\dbg_x86.msi
を実行します。

1.4 最低限のアセンブラ命令だけざっくり把握する
実際に覚えておかなければならないのは、せいぜい20~50命令ほど。

よく使われるアセンブラ命令
MOV,ADD,SUB,INC,DEC,LEA,CMP,TEST,JE(JZ),JNE(JNZ),JMP,CALL,PUSH,POP

test命令は、ほとんどの場合においえ、test eax,eax や test ecx,ecx といったように、同じレジスタが2つ渡される形で使われる。
同じレジスタが渡されているtest命令を見つけたら、それは条件分岐であり、「レジスタが0ならば、ZFを1にするんだな」と覚えておけば大丈夫。

戻り値はeaxに格納される。これはある種の決まりごとであり、多くのプロセッサでは常識に扱われている。
サブルーチンに渡す引数は、push命令を使って、スタックに格納する。「引数はスタックに積まれる」

1.5 アセンブラ命令から動作を把握しよう
OllyDbg ショートカット
Ctrl+F9:リターンまで実行
Alt +F9:ユーザーコードまで実行

コラム アセンブラを書こう
「(アセンブラで)書くことで、読み書き両方の能力が鍛えられる」

Windows環境で動作するアセンブラやリンカ

NASM(v2.11.05)
http://www.nasm.us/
http://www.nasm.us/pub/nasm/releasebuilds/2.11.05/nasm-2.11.05.zip

ALINK
http://alink.sourceforge.net/download.html
http://alink.sourceforge.net/files/al_al.zip

NASM はダウンロードできるのはソース一式で、実行ファイルは入っていません。
READMEに従って、「Visual Studio コマンド プロンプト (2010)」で
nmake /f Mkfiles/msvc.mak
とすることで、nmasm.exe と ndisasm.exe がビルドされます。

Download my Win32 Import library (win32.lib)
http://alink.sourceforge.net/files/win32lib.zip
hello32.asm をリンクする際に必要になります。
解凍して、win32.lib を hello32.asm と同じフォルダにコピーします。

Download Win32 CRT header files and import libraries
http://alink.sourceforge.net/files/al_lib.zip
特に必要ではありませんが、ついでに。

nmasm.exe と alink.exe を C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin に、コピーすると作業が楽になります。


記述に際しては、細心の注意をしたつもりですが、間違いやご指摘がありましたら、こちらからお知らせいただけると幸いです。


→「たのしいバイナリの歩き方」勉強メモ#2
←CTFはじめました


« 戻る