GadgetHunter — コールスタック偽装用jmpガジェット探索ツール
概要
GadgetHunterは「jmpガジェット」を探すためのシンプルなC#製ツールです。jmpガジェットとは、既存のバイナリ中にあるジャンプ命令や間接ジャンプ命令で、回避的あるいは詐称的な制御フロー操作(例:call stack spoofing)に利用される小さな命令列のことを指します。本ツールはディレクトリを指定して中のDLLを順次読み込み、コード領域を走査してjmp命令を検出します。READMEにあるように、結果には「jmp命令のアドレス」と「その直前にあるcall命令の有無(アドレス)」が表示され、callが存在するもののみを返す設定になっています。設計は極めてミニマルで配布/解析が容易です。研究目的や防御側のシグネチャ作成に使える一方で、悪用のリスクもあるため利用には注意が必要です。
リポジトリの統計情報
- スター数: 21
- フォーク数: 2
- ウォッチャー数: 21
- コミット数: 2
- ファイル数: 6
- メインの言語: C#
主な特徴
- 指定ディレクトリ内のDLLを再帰的に走査してjmpガジェットを発見
- jmp命令の直前にcall命令が存在するもののみを報告(callスタック偽装に適合)
- 軽量で依存が少ないC#単体アプリケーション(Program.cs中心の実装)
- 出力はガジェットごとにアドレスと命令コンテキストを表示(オフライン解析に便利)
技術的なポイント
GadgetHunterの核となる処理は、PE(Portable Executable)ファイルのコードセクションを読み取り、バイト列走査によってjmp系命令の候補を検出することです。x86/x64アーキテクチャにおけるjmp命令は直接/間接の形式があり、オペコードやオペランドのパターン(たとえば間接jumps like “jmp qword ptr [reg]” や相対ジャンプ)が存在します。ツールはPEファイルのセクションヘッダを参照して実行可能セクション(.textなど)のオフセットとサイズを特定し、その範囲内をバイト列レベルでスキャンします。
ガジェットの「有用性」の判定においては、jmp命令単体だけでなく、その直前に呼び出し側となるcall命令が存在するかを確認します。READMEにもある通り出力例は「jmp qword ptr [rbx] @ 0x180108B28 - call @ 0x180108B23」のように、jmpのアドレスとその直前に見つかったcallのアドレスを併記します。この直前callの確認は、call stack spoofingで「戻り先」やスタックの整合性を意図的に操作するために重要です。call命令の検出は相対呼び出し(E8 opcode)などの標準的なパターンをチェックする単純な逆アセンブル/バイト解析で可能です。
実装は極めて小規模で、主要な処理がProgram.csに集中している想定です。PEの読み込み、セクションからのバイト取得、バイト走査(スライディングウィンドウ)、簡易的な命令デコーディング、そして条件に合致する場合のレポート出力という流れをとります。高速化のためにメモリマップや並列処理を導入する余地がありますが、現状は単純で可読性を重視した設計です。また、この種のツールはプラットフォームやコンパイラ最適化による命令配置の違い、ASLRやランタイム最適化の影響を受けるため、発見結果をそのまま「攻撃可能」と断定せず、追加の検証(動的解析やコンテキスト確認)が必要です。
セキュリティ的観点としては、GadgetHunterは攻撃手法の研究や赤チーム演習、検出ルール作成に有効ですが、攻撃に転用され得る点を認識しておく必要があります。利用にあたっては社内ポリシーや法令に従い、許可された環境でのみ実行してください。拡張案としては、より精度の高い逆アセンブラ(外部ライブラリ連携)、関数境界の解析、ファイル署名による信頼性フィルタ、ネットワーク経由の一括解析レポート化などが考えられます。
プロジェクトの構成
主要なファイルとディレクトリ:
- .gitignore: file
- GadgetHunter.csproj: file
- GadgetHunter.slnx: file
- LICENSE: file
- Program.cs: file
…他 1 ファイル
Program.csに主要ロジックが集約されており、単一実行可能で起動時に解析対象ディレクトリを引数として渡すことで動作します。READMEには使用例が示されており、System32配下を丸ごと解析するようなユースケースも想定されています。
まとめ
シンプルで解析しやすいjmpガジェット探索ツール。研究・検出ルール作成に便利だが倫理的配慮が必須。
リポジトリ情報:
- 名前: GadgetHunter
- 説明: Find jmp gadgets for call stack spoofing.
- スター数: 21
- 言語: C#
- URL: https://github.com/rasta-mouse/GadgetHunter
- オーナー: rasta-mouse
- アバター: https://avatars.githubusercontent.com/u/7346521?v=4
READMEの抜粋:
GadgetHunter
A simple tool to help find jmp gadgets for use in call stack spoofing. It will only return those that have a call instruction before the gadget.
Usage
Give it a directory to scan (such as System32) and it will process every DLL.
> .\GadgetHunter.exe C:\Windows\System32
|-> C:\Windows\System32\archiveint.dll
|--> Found 1 gadget(s)
|---> jmp qword ptr [rbx] @ 0x180108B28 - call @ 0x180108B23
|-> C:\Windows\System32\AuthFWSnapin.dll
|--> Found 6 gadget(s)
|---> j...