今回はCTFのためにセットアップしているGhidraの環境構築方法をメモしておきます。
Ghidraのインストールについては公式の Ghidra Installation Guide のままなので割愛します。
もくじ
- ghidra-findcrypt の導入
- Ghirathon をセットアップして Python3 のインタプリタを使用する(Linux)
- Ghirathon をセットアップして Python3 のインタプリタを使用する(Windos)
- Ghidra ダークモードで使用する(追記:2024年6月)
- Ghidra の解析結果を GDB から利用する(2023 年 1 月 追記)
- Ghidra Data Type の追加(2023 年 3 月追記)
- Ghidra に PDB をロードする(2023 年 3 月追記)
- まとめ
基本設定
Register と Stack のMarkup の無効化(2024年6月 追記)
現在の Ghidra のデフォルトの設定では、デコンパイラウインドウなどから変数を変更すると、Listing ウインドウ内のレジスタ情報がまとめてリネームされてしまう場合があるため非常に不便です。
また、Listing ウインドウ内の Stack についても自動的にローカル変数の名前に置き換えられてしまうため、直感的にスタック位置を判断しにくいです。
この問題を解決するため、[Edit]>[Tool Options] から [Listing Fields]>[Operands Field] を開き、「Markup Register Variable References」と「Markup Stack Variable References」の設定を無効化しておきます。
UI のテーマ設定について(2024年7月 追記)
UI のテーマ設定やカスタマイズについては以下の記事にまとめています。
参考:Ghidra の UI テーマのカスタマイズに関する Tips
Code Brouser の設定
基本はリバースエンジニアリングツールGhidra実践ガイドを参考にしてセットアップをしています。
Listing Binary の行間
まずはListing Binaryウィンドウの行間を1に設定します。
Code Brouserの[Edit]>[Tool Options]から[Listing Fields]>[Bytes Field]の[Maximum Lines To Display]を1に変更しました。
以下がBefore-Afterです。
↓Before
↓After
結構すっきりして見やすくなったと思います。
Key bindingの設定
キーバインドは同じくCode Brouserの[Edit]>[Tool Options]から[Key Binding]を選択することで変更できます。
ここは好きに設定します。
個人的によく使うFunction Graphウィンドウの呼び出しなんかを設定してます。
デコンパイラウィンドウのコメント
Code Brouserの[Edit]>[Tool Options]から[Decompiler]を選び、デフォルトで非表示になっているコメントを表示するよう変更します。
XRefの表示設定の追加
Listingウィンドウから参照できるXRefウィンドウの列を追加します。
とりあえずFunction Nameがあると便利です。
Symbol Source の設定
シンボルファイルのパスとソースを指定します。
Eclipseのセットアップ
Ghidraの拡張機能をビルドするためにまずはEclipseをインストールします。
WindowsでもLinuxでも以下からダウンロードしたインストーラを実行するとインストールできます。
参考:Eclipse Downloads | The Eclipse Foundation
今回は一番上のJava Developersを選択してインストールしました。
Ghidra Develop ToolsをEclipseにインストールする
Eclipseのインストールが完了したら Ghidra Develop Tools をインストールします。
インストールのために、Ghidraの Script Manager から適当なスクリプトを右クリックして[Edit with Eclipse]を選択します。
ここで、Eclipseのフルパスを指定します。
これでEclipseに拡張機能がインストールされ、上部のタブに[GhidraDev]が追加されます。
ghidra-findcrypt の導入
10.2.x 系でインストールします。
参考:GitHub - TorgoTorgo/ghidra-findcrypt: Ghidra analysis plugin to locate cryptographic constants
※ Ghidra の 10.3.x 系だと gotools などの他のプラグインのテンプレート不一致が発生する点に注意がが必要です。
スクリプトの設定
次にGhidra Scriptの設定を行います。
Ghidraにスクリプトを追加する方法はとても簡単で、Script ManagerからBundle Managerを開いて、スクリプトの配置されたフォルダを開くだけです。
pwndraをセットアップする
pwndraはCTFに便利なGhidra Scriptです。
以下のリポジトリのリリースページからダウンロードしたファイルを解凍してGhidraに追加します。
参考:0xb0bb/pwndra: A collection of pwn/CTF related utilities for Ghidra
ghidra_scriptsをセットアップする
以下からダウンロードしたファイルをGhidraに展開します。
参考:AllsafeCyberSecurity/ghidra_scripts: Ghidra scripts for malware analysis
Ghirathon をセットアップして Python3 のインタプリタを使用する(Linux)
Ghidra は、デフォルトで Jython ベースの Python2 インタプリタを使用できます。
ただし、できるだけ Python3 系を使っていきたいという背景もあり、MANDIANT が OSS として提供している拡張機能 Ghidrathon を使用して Python3 インタプリタと Ghidra を連携していきます。
インストール方法については以下を参照します。
参考:mandiant/Ghidrathon: The FLARE team’s open-source extension to add Python 3 scripting to Ghidra.
バージョンによって前提要件になるビルドツールのバージョンが異なるので注意です。
# https://gradle.org/releases/ から 7.3 以上の Gradleをダウンロードして PATH を通しておく
export PATH=/<path to gradle>/gradle-7.6/bin:$PATH
# Ghidra の使用するバージョンと同じ JDK を使用して JAVA_HOME を設定しておく
export JAVA_HOME=<path to JDK 17>
# ビルド
git clone https://github.com/mandiant/ghidrathon
cd ghidrathon
gradle -PGHIDRA_INSTALL_DIR=<full path to Ghidra>
ビルドが完了すると、Ghirathon のソースディレクトリ内の dist というディレクトリに拡張機能のファイルが作成されるのでこれをインポートします。
続いて、[File]>[Configure] の Ghidra Core から既定の Python プラグインを無効化します。
これで [Window]>[Ghidrathon] を開くと、Python3 が使用できるインタプリタが起動します。
Ghirathon をセットアップして Python3 のインタプリタを使用する(Windos)
せっかくなので Windows でも Ghirathon をセットアップしていきます。
Linux と同じく、gradle のバージョン 7 系をダウンロードして、PATH を通しておきます。
また、Ghidra の使用するバージョンと同じ JAVA のフォルダを JAVA_HOME に設定しておきます。
この状態で、PowerShell を使用して以下のコマンドを実行すると拡張機能をビルドできます。
git clone https://github.com/mandiant/ghidrathon
cd ghidrathon
gradle -PGHIDRA_INSTALL_DIR=<full path to Ghidra>
後は Linux の場合と同じく Ghidra に拡張機能をインストールすれば完了です。
Ghidra ダークモードで使用する(追記:2024年6月)
前項を記載した後のバージョンである Ghidra 10.3 以降では、デフォルトで Ghidra のテーマを設定する機能が追加されています。
使い方は簡単で、以下のように [Edit]>[Theme]>[Switch] からデフォルト、もしくは後から追加したテーマを選択するだけです。
この機能を使用すると、非公式のモジュールを使用することなく、Ghidra をダークモード化できます。
また、サードパーティのテーマファイルをインポートして使用することもできます。
Ghidra の解析結果を GDB から利用する(2023 年 1 月 追記)
Ghidra の解析結果を GDB から利用できるようにするため、ghidra2dwarf というスクリプトを環境にセットアップします。
まず、https://github.com/cesena/ghidra2dwarf/releases/download/latest/ghidra2dwarf.zip からダウンロードしたファイルを任意の場所に展開しておきます。
次に、Ghidra の Bundle Manager から展開したフォルダパスを登録します。
Script Manager に追加されたghidra2dwarf.py
を実行すると、FileName_dbg
とFileName_dbg.c
という 2 つのファイルが生成されます。
この、FileName_dbg
というファイルはデバッグシンボルとして利用できるため、以下のようなコマンドで生成されたデバッグシンボルを添えて gdb を起動することで、Ghida の解析情報を gdb から利用できるようになります。
gdb -exec=./FileName -s=./FileName_dbg
TODO:ghidra2dwarf で生成したシンボルを peda で読み込ませるとレジスタやスタックの情報が表示されなくなる問題を解消する(info registers
などは普通に使えるので peda との競合っぽい?)
Ghidra Data Type の追加(2023 年 3 月追記)
Ghidra でバイナリ解析を行う際には、適切な構造体や関数型を「Data Type Manager」としてインポートしておくとよいです。
特に、WinAPI 関連の gtd をインポートしていきます。
まずは、下記からダウンロードしたファイルを任意のフォルダに展開します。
参考:ghidra-data/typeinfo at master · 0x6d696368/ghidra-data
次に、Data type manager の Open Achive File から展開した gdt を指定し、インポートします。
最後に、インポートした gdt を右クリックして [Apply Function Datatype] をクリックすれば適用完了です。
Ghidra に PDB をロードする(2023 年 3 月追記)
WinDbg での解析時にキャッシュされた pdb ファイルを PE ファイルの解析時に適宜読み込ませていきます。
特に ntdll などは入れておくとスムーズに解析ができる場合があります。
※ ちなみに経験上、恐らく Ghidra 側の問題で ntdll の関数名を解決してくれない場合があるので、念のため同じ関数アドレスについては WinDbg でも見ておくとよいかもしれません。
アーカイブ
このセクションには、Ghidra のアップデートなどによって情報が古くなった項目を記載しています。
gotools の導入(2024年6月 アーカイブ化)
EclipseにGhidra Dev拡張をインストールしたら、gotoolsをセットアップします。
参考:GitHub - felberj/gotools: Plugin for Ghidra to assist reversing Golang binaries
gotoolsはGolangでビルドされたx86_64向けのバイナリの解析をサポートしてくれる拡張機能です。
詳しくはリバースエンジニアリングツールGhidra実践ガイドに書いてあります。
まずはgotoolsからコードをcloneしてEclipseのメニューからプロジェクトファイル(.project
)を開きます。
この時、[Package Explorer] で開いたプロジェクトのプロパティから [Linked Resource] の設定を、自分の環境のGhidraのPathに設定します。
ここまで完了したら、Eclipseの[Ghidra Module Extension…]メニューからgotoolsをビルドしてGhidraにインストールします。
これでGhidraにgotools拡張がインストールされました。
おまけ:UIの変更(2024年6月 アーカイブ化)
GhidraのUIテーマは[Edit]>[Tool Options]の以下の箇所から変更できます。
以下はWindows環境における各テーマのUIです。
Linuxの場合はディストリビューションごとにテーマやデザインが変わります。
- System
- Metal
- Nimbas
- CDE/Motif
- Windows
- Windows Classic
Ghidraの設定ファイルを直接編集するともっと細かいUIカスタマイズもできますが、僕の環境では特にいじっていないので割愛します。
Ghidra ダークモードで使用する(追記:2022年12月)(2024年6月 アーカイブ化)
Ghidara の UI をテーマから選択すると、色の反転しかできないため非常に気持ち悪い配色のダークモードになります。
そこで、ghidra-dark という非公式のスクリプトを使用することで Ghidra UI をダークモードに変更します。
手順は以下の順にコマンドを実行するだけです。(以下は Windowsの場合の実行例)
git clone https://github.com/zackelia/ghidra-dark
cd .\ghidra-dark\
# Linux の場合は python3 install.py
python.exe .\install.py
これだけで以下の画像のようにいい感じのダークモード UI を使用することができるようになります。
GhidRust の導入(2024年6月 アーカイブ化)
GhidRust プラグインもビルドしておきます。
どうやら 10.2.x だとビルドに失敗するようなので、10.3.x にバージョンアップしておきます。
git clone https://github.com/DMaroo/GhidRust
cd GhidRust
gradle.bat -PGHIDRA_INSTALL_DIR=<Ghidraのインストールフォルダ>
参考:DMaroo/GhidRust: GhidRust: Rust decompiler plugin for Ghidra
※ Ghidra の 10.3.x 系だと gotools などの他のプラグインのテンプレート不一致が発生する点に注意がが必要です。
ghidra-wasm-plugin の導入(2024年6月 アーカイブ化)
10.2.x 系でインストールします。
参考:GitHub - nneonneo/ghidra-wasm-plugin: Ghidra Wasm plugin with disassembly and decompilation support
まとめ
また環境を変えたら記事もアップデートします。