
Ghidra/Sleighを使用したマルチアーキテクチャpcodeエミュレータ。AFL++によるバイナリ、ファームウェア、組み込みターゲットのファジングに対応し、ASANでメモリ破壊バグを検出します。

Ghidralligator は、Ghidra の libsla をベースにした C++ 製マルチアーキテクチャ pcode エミュレータであり、AFL++ によるファジングを目的として設計されています。
エミュレーションベースのファジングを実行できる一方で、エキゾチックなアーキテクチャ上で動作するバイナリを扱う際にも、優れたパフォーマンスを維持できます。
拡張可能な設計であるため、対応する Sleigh 仕様ファイル を書くことができれば、事実上あらゆるアーキテクチャをエミュレートし、任意のコード片をファジングすることが容易に可能です。
Ghidralligator は Linux システム上で動作します。必要なのは、C++ バージョン 17 をサポートする GCC のみです(GCC バージョン 12.2.0 でテスト済み、動作確認済み)。
Ghidra の依存関係は、プロジェクト自体の "./src/" ディレクトリ内に埋め込まれています。
Ghidralligator を正しくインストールするには、以下の手順で AFL++ をダウンロードしてコンパイルする必要があります:
git clone https://github.com/AFLplusplus/AFLplusplus
cd AFLplusplus
make distrib
sudo make install
git clone https://github.com/airbus-cyber/ghidralligator
cd ghidralligator
make ghidralligator
Ghidralligator は、計測・実行・ファジングのために多くのセットアップや手動による変更を必要とする既存のエミュレータと、拡張が難しく特定の特殊な用途には適さない「ブラックボックス」エミュレータとの間のギャップを埋めることを目的としています。
主な用途は、クローズソースバイナリの脆弱性調査、特にエキゾチックなアーキテクチャで動作する組み込みデバイスアプリケーション / ファームウェアを対象とした調査です。
Ghidralligator は afl_ghidra_emu の後継です。実行速度が大幅に向上し、ヒープメモリ破損検出 (ASAN) などの便利な機能が追加されています。
幅広い種類のメモリ破損を検出できます: 範囲外の読み取り/書き込み操作、use-after-free、double-free、未初期化メモリの読み取り、読み取り/書き込み/実行アクセス違反など...
Ghidralligator を実行するには、以下の手順を実行する必要があります:
Ghidralligator の使用方法を理解するために、さまざまなアーキテクチャでコンパイルされた脆弱なプログラムの例が用意されています。
run_examples.sh を実行すると、ASAN メカニズムの動作を確認できます。
Ghidralligator にはいくつかのコマンドラインオプションがあります:
usage: ./ghidralligator [OPTION]
-h このヘルプを表示して終了します。
-m [replay|fuzz] エミュレーション戦略を指定します。 [必須]
'replay' モードでは、エミュレータはプログラムを一度だけ起動し、単一ループの後に終了します。
'fuzz' モードでは、このプログラムは AFL を通じて起動する必要があります。
-c [FILENAME] 読み込むエミュレータの json 設定ファイルを指定します。 [必須]
-i [FILENAME] リプレイセッション中に挿入するテストケースファイルを指定します。 [任意]
-I 情報ログを表示します (/!\ エミュレーションが遅くなります)。 [任意]
-D デバッグおよび情報ログを表示します (/!\ エミュレーションが遅くなります)。 [任意]
-t ログを ./ghidraligator.log ファイルに保存します。 [任意]
標準的なエミュレーションの使用法:
$ ./ghidralligator -m replay -c examples/x86/config.json -I -i examples/x86/input/normal_use_case.bin

標準的な AFL++ ファジングセッションの使用法:
mkdir afl_inputs afl_outputs
echo -n "AAAAAA" > ./afl_inputs/input.bin
$ AFL_SKIP_BIN_CHECK=1 afl-fuzz -D -i ./afl_inputs -o ./afl_outputs/ -- ./ghidralligator -m fuzz -c examples/x86/config.json

Ghidralligator は .sla ファイル (Sleigh 命令定義ファイル) を使用してコードをエミュレートできます。Ghidra コミュニティが提供する SLA ファイルは部分的にしか実装されていない場合があります。一貫したエミュレーションを得るには、関連する Sleigh アーキテクチャ定義を補完するか、いくつかのフックを追加する必要があるかもしれません。
Ghidralligator は、エミュレーション目的での高性能を考慮して設計されていない Ghidra に基づいています。そのため、標準的なアーキテクチャ (x86 Linux / Windows バイナリ) において、afl_qemu のような一般的なファザーと競合することはできません。
Ghidra プロジェクトは常に進化しているため、将来の Ghidra バージョンに向けて Ghidralligator の依存関係を手動で更新することは推奨されません。このツールは Ghidra 11.0.3 デコンパイラソースを使用してビルドおよびテストされています。将来のバージョンでは動作しなくなる可能性があり、11.0.3 より前のバージョンとの下位互換性はサポートされていません。Ghidra の依存関係はこのリポジトリに含まれているため、ユーザーにとってこれは透過的です。
Ghidralligator は Apache ライセンス バージョン 2.0 の下でリリースされています。
Ghidralligator のコードには、NationalSecurityAgency による Ghidra プロジェクトのコードが含まれており、Apache ライセンス 2.0 の下でリリースされています。
Ghidralligator の設定ファイルパーサには、Niels Lohmann による C++ json ライブラリ が含まれており、MIT ライセンス の下でリリースされています。
Ghidralligator モジュールには、Yann Collet による xxHash ライブラリ が含まれており、BSD 2-Clause License の下でリリースされています。