本章では、本書で使用する環境構築の手順について紹介します。
なお、本書で使用するバイナリの実行やデバッグには仮想マシンを使用することを前提としています。
私は、Windows 10/11 の Pro エディションに付属している Hyper-V を利用することをおすすめしています。
しかし、Windows 10 / 11 の Home エディションを利用する場合でも、VirtualBox や VMWare などのサードパーティ製の仮想化アプリケーションを使用することで仮想マシンを作成することが可能です。
もくじ
- 本書で使用する環境について
- 仮想マシンの作成
- 仮想マシンのセットアップ
- WinDbg のインストール
- Debugging Tools for Windows のインストール
- Sysinternals ユーティリティのインストール
- WinDbg と Sysinternals にシンボルサーバを登録する
- Ghidra 11.0.2 のインストール
- Binary Ninja のインストール
- その他解析ツールのインストール
- WinDbg によるカーネルデバッグの準備
- ネットワーク経由でカーネルデバッグを行う
- 解析対象プログラムのダウンロード
- 各章へのリンク
本書で使用する環境について
本書の内容については、以下の環境で確認を行っています。
OS : Windows 10 Pro 22H2
なお、仮想マシンを用意することを前提としているため、ある程度快適に操作するためにも、CPU は Intel Core i3 以上、RAM は 8 GB 以上の端末を使用することを推奨します。
仮想マシンの作成
本書では仮想マシンのインストール方法については詳しい手順の解説は行いません。
Windows 10/11 Pro や Enterprise、または Education を利用している場合は、無料で利用できる Hyper-V の使用をおすすめします。
Hyper-V を有効化して仮想マシンを作成する手順については、以下の公式ドキュメントの手順を利用できます。
Install Hyper-V on Windows 10:
https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v
もし、みなさんの利用中の OS のエディションが Windows 10/11 Home の場合には Hyper-V を利用することはできません。
その場合は、無料でインストール可能な VirtualBox などの仮想マシンプラットフォームを利用することができます。(少なくとも本書執筆時点での最新バージョンである VirtualBox 7.0.14 を使用する場合には、Windows 10/11 の Home エディションにもインストールし、仮想マシンを作成できることを確認しております。ただし、当該バージョンには悪用が容易な既知の脆弱性の存在が報告されているため、可能な限り利用時点で最新のバージョンをインストールすることを推奨します。)
VirtualBox は以下のダウンロードページから取得したインストーラを使用することでインストールできます。
Download VirtualBox:
https://www.virtualbox.org/wiki/Downloads
なお、VirtualBox 7.0.14 をインストールするためには以下の URL からダウンロードできる vc_redist.x64.exe を実行して、最新の再頒布可能パッケージをインストールする必要があります。
vc_redist.x64.exe:
https://aka.ms/vs/17/release/vc_redist.x64.exe
Hyper-V や VirtualBox などの仮想マシンプラットフォームの準備が完了したら、Windows 10 の仮想マシンを作成します。
一般に、どの仮想化プラットフォームを利用する場合でも、OS を始めにインストールする際には OS インストール用の ISO イメージファイルを利用します。
本書で解析に使用する Windows 仮想マシンをセットアップする際には、以下からダウンロード可能な評価版 OS の ISO を使用します。(ダウンロードにはメールアドレスなどの入力が必要です)
評価版 OS をインストールすると、インストール後から 90 日間、Windows 10 のフル機能を利用できます。
Windows 10 Enterprise(評価版):
https://www.microsoft.com/ja-jp/evalcenter/evaluate-windows-10-enterprise
仮想マシンのセットアップ
解析対象のプログラムを実行するための仮想マシンのセットアップが完了したら、デバイスドライバをインストールしてカーネルデバッグを行うためのセットアップを行います。
まずは管理者権限で起動したコマンドプロンプトで以下の 3 つのコマンドを実行した後、OS を再起動します。
bcdedit /set testsigning on
bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200
これらのコマンドを実行することで、対象の仮想マシンでテスト署名されたドライバのインストール 1 と COM ポートを利用したカーネルデバッグ 2 を有効化できます。
Windows Vista 以降のシステムでは、システムにインストールするすべてのドライバに有効な署名が必要です。特に、Windows 10 バージョン 1607 以降のシステムでは、ドライバは Microsoft によって有効な署名が付与されている必要があります。3 4
しかし、Windows で bcdedit /set testsigning on
を実行してテスト署名されたドライバのインストールを有効化した場合には、テスト用の自己署名証明書などによって署名されたドライバのインストールが可能になります。
そのため、本書で使用するカーネルドライバをシステムにインストールして実行するために、テスト署名モードを有効化する必要があります。
システムでテスト署名モードが有効化されると、以下のようにデスクトップの右下に「テストモード」と表示されます。
なお、テスト署名モードが有効化されている場合は Microsoft による署名が付与されていないドライバをシステムにインストールできるようになるため、不正なドライバがインストールされるリスクがあります。
そのため、テスト署名モードは必ず仮想マシンでのみ有効化するようにしてください。
WinDbg のインストール
プログラムの解析のため、コンピュータに最新の WinDbg をインストールします。
なお、カーネルデバッグを行うため、WinDbg は必ず仮想マシンを管理するホスト端末にインストールしてください。
もちろん、ユーザモードデバッグ用に仮想マシン側にもインストールすることは問題ありません。
最新の WinDbg は、WinGet パッケージマネージャを利用できる環境であれば、コマンドプロンプトや PowerShell で以下のコマンドを実行することで簡単にインストールできます。
winget install Microsoft.WinDbg
WinGet パッケージマネージャを利用できない場合は、以下の URL から WinDbg のインストーラファイルをダウンロードし、WinDbg のインストールを行います。
Install the Windows debugger:
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/
Debugging Tools for Windows のインストール
続けて解析を行うマシンに Debugging Tools for Windows をインストールします。
Debugging Tools for Windows には、WinDbg Classic 5 などのデバッガや、GFlags 6 のような Windows 環境のトラブルシューティングに役立つツールが含まれています。
Debugging Tools for Windows をインストールする方法はいくつかありますが、本書では Windows SDK (10.0.22621) を使用して Debugging Tools for Windows のインストールを行います。
まずは、以下の URL で Windows SDK のダウンロードページにアクセスし、[Download the installer] から winsdksetup.exe をダウンロードします。
Windows SDK:
https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/
続いて、ダウンロードした winsdksetup.exe をダブルクリックして実行します。
デフォルト設定のままインストーラの指示に従っていくと、最後にインストールするパッケージの選択画面が表示されます。
ここではどの項目をダウンロードしても問題ありませんが、必ず [Debugging Tools for Windows] にチェックが入っていることを確認してください。
[Debugging Tools for Windows] にチェックが入った状態でインストーラを実行します。
インストーラの実行が完了したら、C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
内に windbg.exe や gflags.exe が存在することを確認します。
Windows SDK でインストール可能な windbg.exe は、WinDbg Classic とも呼ばれる従来のデバッガです。
最新バージョンの WinDbg と WinDbg Classic のデバッガコマンドやウィンドウなどは同一ですが、最新バージョンの WinDbg では JavaScript によるデバッガスクリプトや Time Travel Debugging(TTD) などの強力なデバッガ機能を利用できます。
本書では、WinDbg Classic ではなく、[WinDbg のインストール] の項でインストールした最新バージョンの WinDbg を使用します。
Sysinternals ユーティリティのインストール
※ Sysinternals ユーティリティは本書では使用しないため、インストールは必須ではありません。
次に、Process Monitor 7 や Process Explorer 8 などの便利なツールを含む Sysinternals 9 を取得します。
これらのツールについて、本書では詳しい説明は割愛します。
詳しく知りたい方は公式ドキュメントや「Windows Sysinternals徹底解説」10 などが参考になると思います。
これらのツールをまとめてインストールするため、以下の URL にアクセスして [Sysinternals Suite] をクリックします。
Sysinternals ユーティリティ:
https://learn.microsoft.com/ja-jp/sysinternals/downloads/
ここからダウンロードした ZIP ファイルを解凍することで、Process Monitor や Process Explorer などのツールを利用できるようになります。
WinDbg と Sysinternals にシンボルサーバを登録する
WinDbg や Process Monitor(Procmon) などを使用してトラブルシューティングを行う際に適切なシンボルを取得することは非常に重要です。
シンボル 11 とは、exe や dll などの実行ファイルには含まれない関数や変数の名称などを含む情報です。
WinDbg などのツールを使用する際には、適切なシンボルを取得し参照することで、よりスムーズな解析を行うことが可能です。
一般にダンプファイルの解析で使用するシンボル情報は Microsoft が公開しているシンボルサーバ 12 から取得できます。
ただし、一部の公開されていないモジュールのシンボル情報や、サードパーティが独自に開発したソフトウェアのシンボル情報は、Microsoft によって公開されているシンボルサーバからダウンロードすることはできません。
なお、解析対象のプログラムがユーザ自身によって開発されている場合は、プログラムのビルド時に生成できる pdb や dbg ファイルをシンボル情報としてデバッガにロードして利用できます。
この項では、Microsoft が公開しているシンボルサーバからシンボル情報を取得するため、WinDbg と Process Monitor の設定を行います。
本書では使用しませんが、必要に応じて Process Explorer でも同様の設定を実施しておくとよいでしょう。
シンボルサーバの設定を行うため、WinDbg を管理者権限で起動して、[ファイル]>[Settings]>[Debugging Settings] を開きます。
起動したウインドウの [Default Symbol Path] に以下を入力して、[OK] をクリックします。
srv*https://msdl.microsoft.com/download/symbols
次に、[Sysinternals ユーティリティのインストール] で取得した SysinternalsSuite から Procmon64.exe を管理者権限で実行します。
起動した Procmon のウインドウ上部のメニューから [Options]>[Configure Symbols…] をクリックします。
既定では、[DbgHelp.dll path(version 6.0 or later)] に C:\WINDOWS\SYSTEM32\dbghelp.dll
が登録されています。
しかし、C:\WINDOWS\SYSTEM32\dbghelp.dll
は通常はバージョン 6.0 以上の要件を満たさないので、要件を満たす dbghelp.dll のパスを指定する必要があります。
この要件を満たす dbghelp.dll は、[Debugging Tools for Windows のインストール] でインストールした WinDbg x64 などと同じく C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
の直下に配置されています。
そのため、[DbgHelp.dll path(version 6.0 or later)] には以下のパスを指定します。
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll
また、[Symbol paths:] には WinDbg の時と同じく Microsoft のシンボルサーバのアドレスを指定します。
srv*https://msdl.microsoft.com/download/symbols
これでシンボルサーバの設定は完了です。
Ghidra 11.0.2 のインストール
※ Ghidra 11.0.2 は本書では使用しないため、インストールは必須ではありません。
次に、リバースエンジニアリングツールの Ghidra 11.0.2 のセットアップを行います。
Ghidra の詳細や詳しい利用方法については本書では解説しませんが、Ghidra に同梱されている Help や、「リバースエンジニアリングツール Ghidra 実践ガイド」13 や「マスタリング Ghidra」14 などの書籍が参考になると思います。
Ghidra のセットアップのため、以下の Github の Release ページから Ghidra 11.0.2 のパッケージ (ghidra_11.0.2_PUBLIC_20240326.zip
) をダウンロードし、解凍しておきます。
Ghidra Release Page:
https://github.com/NationalSecurityAgency/ghidra/releases
続いて、Ghidra を実行するために必要な JDK 17 をインストールするため、以下のダウンロードページから Windows x64 用の MSI Installer をダウンロードします。
Java Downloads:
https://www.oracle.com/jp/java/technologies/downloads/#jdk17-windows
ダウンロードした JDK 17 の MSI インストーラを実行し、JDK 17 のインストールを完了します。
インストールの完了後、展開した ghidra_11.0.2_PUBLIC_20240326.zip
内の ghidraRun.bat をダブルクリックして Ghidra を起動します。
Ghidra の起動が完了したら、[File]>[New Project] から任意の名称の Project を作成しておきましょう。
Binary Ninja のインストール
Windows 用のプログラムを解析するツールには、Ghidra 以外にも IDA や Binary Ninja などの有力な選択肢があります。
Binary Ninja は以下の URL の [Download For Windows] から無料版のインストーラをダウンロードしてインストールすることができます。
Binary Ninja 4.0 Free:
Binary Ninja のインストール方法や基本的な操作については以下のリンク先の公式ページを参照してください。
Binary Ninja 4.0 Getting Started:
https://docs.binary.ninja/getting-started.html
ちなみに、Binary Ninja の使用方法を詳しく知りたい場合、私は Binary Ninja の提供元である VECTOR 35 の公式 YouTube チャンネルを参照することをおすすめしています。
Youtube VECTOR 35:
https://www.youtube.com/@Vector35
その他解析ツールのインストール
本書ではここまで紹介したもの以外に、Windows プログラムの解析に利用できる PEStudio を使用します。
また、本書では使用しませんが、PEStudio と類似の用途で利用できるツールとして PE-bear や Explorer Suite に含まれる CFF Explorer も便利です。
詳しいセットアップ方法は割愛しますが、各ツールは以下のリンク先からダウンロードできます。
PEStudio:
https://www.winitor.com/download
PE-bear:
https://github.com/hasherezade/pe-bear
Explorer Suite:
https://ntcore.com/explorer-suite/
WinDbg によるカーネルデバッグの準備
[仮想マシンのセットアップ] で設定した仮想マシンに、ホストマシンにインストールされた WinDbg から COM ポートを利用したカーネルデバッグが可能となることを確認します。
Hyper-V を使用している場合は、対象の仮想マシンの設定画面を開き、[COM 1] のハードウェア設定から、アタッチメントを [名前付きパイプ] に変更してパイプ名を [com1] に設定します。
以下の画面の通り、[名前付きパイプのパス] に表示される値が \\\\.\\pipe\\com1
となっていれば OK です。
VirtualBox を使用している場合は、同じく作成した仮想マシンの設定画面から [シリアルポート] の設定画面を開き、[ポート 1] のタブから [シリアルポートを有効化] のチェックボックスを有効にします。
[ポート番号] を [COM1]、[ポートモード] を [ホストにパイプ] とし、[パス/アドレス] に \\\\.\\pipe\\com1
を入力して設定を保存します。
Hyper-V や VirtualBox で作成した仮想マシンの COM ポートを設定したら、WinDbg を起動してカーネルデバッガをアタッチします。
新しいバージョンの WinDbg を使用する場合は、[ファイル]>[Start Debugging] から [Attach to Kernel] を選択します。
[Attach to Kernel] の設定画面を開き、[COM] タブの [Baud Rate] を 115200 に設定し、Port を \\\\.\\pipe\\com1
とします。
なお、[Break on Connection] のチェックを入れておけば WinDbg をカーネルデバッガとしてマシンにアタッチした際に自動で Break が行われ、VM 側のシステムが停止します。
WinDbg がカーネルデバッガとしてシステムにアタッチされた場合には、以下の画面のように OS バージョンなどが表示され、WinDbg のコマンドウィンドウにコマンドを入力できるようになります。
カーネルデバッガが仮想マシンのカーネルをデバッグしている場合、仮想マシン側の動作は停止します。
そのため、Hyper-V の拡張セッションや RDP などにより仮想マシンにリモート接続している場合には、画面がブラックアウトしてリモートアクセスが切断されます。
Hyper-V で構築した仮想マシンのカーネルデバッグを行う際には、拡張セッションを無効化した状態でコンソールアクセスしておくことをおすすめします。
システムの操作を再開したい場合には g
コマンドを実行します。
ネットワーク経由でカーネルデバッグを行う
前項では COM ポートを使用するカーネルデバッガ接続をセットアップしましたが、COM ポートによるデータ転送はボーレートに設定可能な最大値である 115200 を設定している場合でも非常に遅いです。
lm や k などの一般的なデバッガコマンドの実行であれば特に遅延を感じることはないと思いますが、例えば .dump コマンド 15 などの大量のデータ転送が必要なコマンドを使用する場合、COM ポートを使用していると完了まで数時間以上かかる場合があります。
このような場合には、COM ポートではなくネットワーク経由でのカーネルデバッグをセットアップすることをおすすめします。
ネットワーク経由でのカーネルデバッグは手動でもセットアップできますが、kdnet.exe による設定方法を利用する方が確実です。16
ネットワーク経由のカーネルデバッグを使用するため、まずはデバッグを行うホストマシンと、ターゲットである仮想マシンが IPv4 を利用するネットワーク通信が可能な環境を用意します。
仮想マシンプラットフォームとして Hyper-V を使用している場合は [仮想スイッチマネージャー] から内部通信用の仮想スイッチを作成して仮想マシンにアタッチし、静的な IPv4 アドレスを固定しておくと良いでしょう。
本書では、ホストマシンに 192.168.50.1/25
、仮想マシンに 192.168.50.12/25
の IP アドレスを割り当てています。
ホストマシンと仮想マシンのネットワーク接続を確立したら、次は仮想マシン側でコマンドプロンプトを管理者として実行し、"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\kdnet.exe"
を実行します。
kdnet.exe は [Debugging Tools for Windows のインストール] の項で Debugging Tools for Windows をインストールしたフォルダに配置されています。
kdnet.exe をオプション無しで実行した際に Network debugging is supported by this Microsoft Hypervisor Virtual Machine
と表示されることを確認できたら、続けて "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\kdnet.exe" <HostComputerIPAddress> <YourDebugPort>
を実行します。
この時、HostComputerIPAddress にはデバッグを行うホストマシンの IP アドレス(192.168.50.1
) と、ホストマシン側の WinDbg で後程設定するポート番号(既定値 50000) を指定します。
このコマンドを実行すると、上記の画像の通り key=<KEY 文字列>
を含む出力が得られるので、key=
以降の文字列をコピーしておきます。
続けてデバッグを行うホストマシンで WinDbg を起動し、[Attach to kernel] の [Net] タブの [Port number] と [Key] 欄に、kdnet.exe で設定したポート番号とコピーした key=
以降の文字列を入力し、[OK] をクリックします。
WinDbg でネットワーク経由のカーネルデバッグを実行すると、デバッグコンソールに Waiting to reconnect...
と表示されます。
この状態で、kdnet.exe によるセットアップを行った仮想マシンを再起動すると、ネットワーク経由でホストマシンの WinDbg が仮想マシンのカーネルにアタッチし、ネットワーク経由でのカーネルデバッグが可能になります。
なお、もしネットワーク経由でのカーネルデバッグが上手くいかない場合は、ホストマシンと仮想マシンのネットワーク接続や、ホストマシン側で WinDbg による通信が Microsoft Defender Firewall で許可されているか否かを確認してください。
解析対象プログラムのダウンロード
本書の解析対象となる DoP プログラムを以下のリリースページからダウンロードします。
本書では、この DoP プログラムを解析して 2 つの Flag を特定することを目標とします。
Flag のフォーマットは ^FLAG\{[\x20-\x7E]+\}$
です。
DoP -The dream of a pumpkin-:
https://github.com/kash1064/ctf-and-windows-debug/releases/tag/v1.0/
リリースページからは、以下の 2 つのファイルをダウンロードできます。
DoPClient.exe(SHA256:59D52D6AF3479A75B21784916B8C73396971E75142A1AF0C0900C843E4491710)
DoPDriver.sys(SHA256:4C2F4F26A8F19083CE699B83F91C4430D03EB62DDECA509A16E66FCD7FE46D3D)
ダウンロードした 2 つのファイルは、デバッグ用に作成した仮想マシン内の同じフォルダにコピーしてください。
なお、ほとんどの CTF の問題では、対象ファイルの解析に使用するシンボルファイル(pdb ファイルなど)は提供されません。
また、CTF ではなくトラブルシューティングの目的でデバッグを行う場合でも、読者がそのソフトウェアの開発に関わっている立場でない限り、適切なシンボルファイルを取得できることは稀でしょう。
そのため、本書でもシンボルファイルの無い未知のファイルのデバッグを行います。
シンボルファイルのない未知のプログラムの解析を WinDbg だけで行うことは非常に困難ですが、IDA や Ghidra、Binary Ninja などの解析ツールと併用することで効率的にデバッグを行うことができます。
ちなみに、これらのツールにはデバッグ機能も付属しているため、必ずしも WinDbg を使用する必要はありません。
しかし、本書で使用するようなスクリプトによるデバッガ操作の自動化などの強力な機能は、機能が制限される無料版の IDA や Binary Ninja では使用できません。
本書ではこれらの高度な機能を含むフル機能を利用可能な WinDbg を利用してユーザモードプログラムとカーネルドライバの解析を行います。
なお、DoP プログラムを実行するため、環境によっては事前に以下の URL からダウンロードできる vc_redist.x64.exe を実行して最新の再頒布可能パッケージをインストールする必要があります。
vc_redist.x64.exe:
https://aka.ms/vs/17/release/vc_redist.x64.exe
各章へのリンク
- まえがき
- 1 章 環境構築
- 2 章 DoPClient と DoPDriver の表層解析
- 3 章 DoPClient の静的解析を行う
- 4 章 DoPClient を動的解析する
- 5 章 DoPDriver の静的解析を行う
- 6 章 DoPDriver を動的解析する
-
Enable Loading of Test Signed Drivers https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/the-testsigning-boot-configuration-option
↩ -
Setting Up Kernel-Mode Debugging of a Virtual Machine Manually using a Virtual COM Port https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/attaching-to-a-virtual-machine—kernel-mode-
↩ -
Signing a Driver https://learn.microsoft.com/ja-jp/windows-hardware/drivers/develop/signing-a-driver
↩ -
Driver Signing Policy https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/kernel-mode-code-signing-policy—windows-vista-and-later-
↩ - ↩
-
GFlags https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/gflags
↩ -
Process Monitor https://learn.microsoft.com/ja-jp/sysinternals/downloads/procmon
↩ -
Process Explorer https://learn.microsoft.com/ja-jp/sysinternals/downloads/process-explorer
↩ -
Sysinternals https://learn.microsoft.com/ja-jp/sysinternals
↩ -
Windows Sysinternals徹底解説 : 無償ツールで極めるトラブルシューティングテクニック (Mark E. Russinovich・Aaron Margosis 著 / 山内 和朗 訳 / 日経BP社 / 2017 年)
↩ -
Symbols and Symbol Files https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/symbols-and-symbol-files
↩ -
Using a Symbol Server https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/using-a-symbol-server
↩ -
リバースエンジニアリングツール Ghidra 実践ガイド セキュリティコンテスト入門からマルウェア解析まで (中島 将太, 小竹 泰一, 原 弘明, 川畑 公平 著 / マイナビ出版 / 2020 年)
↩ -
マスタリング Ghidra 基礎から学ぶリバースエンジニアリング完全マニュアル (Chris Eagle, Kara Nance 著 / 石川 朝久 監訳 / 中島 将太, 小竹 泰一, 原 弘明 訳 / オライリー・ジャパン / 2022 年)
↩ -
.dump (ダンプ ファイルの作成) https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debuggercmds/-dump—create-dump-file-
↩ -
KDNET ネットワーク カーネル デバッグを自動的に設定する https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/setting-up-a-network-debugging-connection-automatically
↩