All Articles

CTFのためのGhidra環境構築メモ

今回はCTFのためにセットアップしているGhidraの環境構築方法をメモしておきます。

Ghidraのインストールについては公式の Ghidra Installation Guide のままなので割愛します。

参考:Ghidra Installation Guide

もくじ

基本設定

Register と Stack のMarkup の無効化(2024年6月 追記)

現在の Ghidra のデフォルトの設定では、デコンパイラウインドウなどから変数を変更すると、Listing ウインドウ内のレジスタ情報がまとめてリネームされてしまう場合があるため非常に不便です。

また、Listing ウインドウ内の Stack についても自動的にローカル変数の名前に置き換えられてしまうため、直感的にスタック位置を判断しにくいです。

この問題を解決するため、[Edit]>[Tool Options] から [Listing Fields]>[Operands Field] を開き、「Markup Register Variable References」と「Markup Stack Variable References」の設定を無効化しておきます。

image-20240630102312627

参考:Switch to turn off register naming in disassembler · Issue #309 · NationalSecurityAgency/ghidra · GitHub

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に変更しました。

image-20220315184452595

以下がBefore-Afterです。

↓Before

image-20220315184332509

↓After

image-20220315184354221

結構すっきりして見やすくなったと思います。

Key bindingの設定

キーバインドは同じくCode Brouserの[Edit]>[Tool Options]から[Key Binding]を選択することで変更できます。

image-20220315184903492

ここは好きに設定します。

個人的によく使うFunction Graphウィンドウの呼び出しなんかを設定してます。

image-20220315190317307

デコンパイラウィンドウのコメント

Code Brouserの[Edit]>[Tool Options]から[Decompiler]を選び、デフォルトで非表示になっているコメントを表示するよう変更します。

image-20220315185220108

XRefの表示設定の追加

Listingウィンドウから参照できるXRefウィンドウの列を追加します。

とりあえずFunction Nameがあると便利です。

image-20220315185557616

Symbol Source の設定

シンボルファイルのパスとソースを指定します。

image-20230518234359993

Eclipseのセットアップ

Ghidraの拡張機能をビルドするためにまずはEclipseをインストールします。

WindowsでもLinuxでも以下からダウンロードしたインストーラを実行するとインストールできます。

参考:Eclipse Downloads | The Eclipse Foundation

今回は一番上のJava Developersを選択してインストールしました。

image-20220306224652292

Ghidra Develop ToolsをEclipseにインストールする

Eclipseのインストールが完了したら Ghidra Develop Tools をインストールします。

インストールのために、Ghidraの Script Manager から適当なスクリプトを右クリックして[Edit with Eclipse]を選択します。

image-20220306224922771

ここで、Eclipseのフルパスを指定します。

image-20220306225022503

これでEclipseに拡張機能がインストールされ、上部のタブに[GhidraDev]が追加されます。

image-20220307205731760

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を開いて、スクリプトの配置されたフォルダを開くだけです。

image-20220315205550826

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 というディレクトリに拡張機能のファイルが作成されるのでこれをインポートします。

image-20221216220649821

続いて、[File]>[Configure] の Ghidra Core から既定の Python プラグインを無効化します。

image-20221216220048128

これで [Window]>[Ghidrathon] を開くと、Python3 が使用できるインタプリタが起動します。

image-20221216221158484

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 のテーマを設定する機能が追加されています。

参考:Ghidra What’s New

使い方は簡単で、以下のように [Edit]>[Theme]>[Switch] からデフォルト、もしくは後から追加したテーマを選択するだけです。

image-20240630014107968

この機能を使用すると、非公式のモジュールを使用することなく、Ghidra をダークモード化できます。

image-20240630014154964

また、サードパーティのテーマファイルをインポートして使用することもできます。

Ghidra の解析結果を GDB から利用する(2023 年 1 月 追記)

Ghidra の解析結果を GDB から利用できるようにするため、ghidra2dwarf というスクリプトを環境にセットアップします。

まず、https://github.com/cesena/ghidra2dwarf/releases/download/latest/ghidra2dwarf.zip からダウンロードしたファイルを任意の場所に展開しておきます。

次に、Ghidra の Bundle Manager から展開したフォルダパスを登録します。

image-20230121173602778

Script Manager に追加されたghidra2dwarf.pyを実行すると、FileName_dbgFileName_dbg.cという 2 つのファイルが生成されます。

image-20230121173818579

この、FileName_dbgというファイルはデバッグシンボルとして利用できるため、以下のようなコマンドで生成されたデバッグシンボルを添えて gdb を起動することで、Ghida の解析情報を gdb から利用できるようになります。

gdb -exec=./FileName -s=./FileName_dbg

参考:Ghidraのデコンパイル結果をGDBから使いたい

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

参考:How can I configure ghidra to show more WinAPI function parameters? · Issue #581 · NationalSecurityAgency/ghidra

次に、Data type manager の Open Achive File から展開した gdt を指定し、インポートします。

image-20230325201919683

最後に、インポートした 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に設定します。

image-20220307210038684

ここまで完了したら、Eclipseの[Ghidra Module Extension…]メニューからgotoolsをビルドしてGhidraにインストールします。

image-20220307210114259

これでGhidraにgotools拡張がインストールされました。

おまけ:UIの変更(2024年6月 アーカイブ化)

GhidraのUIテーマは[Edit]>[Tool Options]の以下の箇所から変更できます。

image-20220315204356018

以下はWindows環境における各テーマのUIです。

Linuxの場合はディストリビューションごとにテーマやデザインが変わります。

  • System

image-20220307204726489

  • Metal

image-20220307204806192

  • Nimbas

image-20220307204855497

  • CDE/Motif

image-20220307204940483

  • Windows

image-20220307205101246

  • Windows Classic

image-20220307205028221

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 を使用することができるようになります。

image-20221211133321398

image-20221211133513863

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

まとめ

また環境を変えたら記事もアップデートします。