mcpField
G
ghidra

ghidra

github.com/mitsuhikoセキュリティ3.2k630 回インストール4 週間前に更新
リポジトリ

ghidra について

ghidra は、Ghidra の analyzeHeadless を使ってリバースエンジニアリングを自動化するスキルです。セキュリティ研究者や分析担当者向けに、バイナリーの逆コンパイルや関数、文字列、シンボル、コールグラフ、概要の出力を支援します。

主な機能

  1. 01Ghidra のヘッドレス解析を実行
  2. 02関数を C の疑似コードに逆コンパイル
  3. 03関数、文字列、シンボルを出力
  4. 04関数のコールグラフを生成
  5. 05セキュリティ関連関数を抽出
  6. 06プロセッサーアーキテクチャと解析設定を指定

活用シーン

  1. 01未知のバイナリーを解析
  2. 02指定アーキテクチャでファームウェアを調査
  3. 03調査用に文字列とシンボルを抽出
  4. 04呼び出し関係とセキュリティ関連関数を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mitsuhiko/agent-stuff --skill ghidra

インストール後、Claude Code で/ghidraを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

scripts/
find-ghidra.sh
ghidra-analyze.sh
scripts/ghidra_scripts/
ExportAll.java
ExportCalls.java
ExportDecompiled.java
ExportFunctions.java
ExportStrings.java
ExportSymbols.java

詳細

Ghidra ヘッドレス解析スキル

Ghidra の analyzeHeadless ツールを使用して、自動でリバースエンジニアリングを実行します。バイナリをインポートして解析し、C コードにデコンパイルして、有用な情報を抽出します。

クイックリファレンス

タスクコマンド
すべてのエクスポートを含む完全解析ghidra-analyze.sh -s ExportAll.java -o ./output binary
C コードにデコンパイルghidra-analyze.sh -s ExportDecompiled.java -o ./output binary
関数を一覧表示ghidra-analyze.sh -s ExportFunctions.java -o ./output binary
文字列を抽出ghidra-analyze.sh -s ExportStrings.java -o ./output binary
呼び出しグラフを取得ghidra-analyze.sh -s ExportCalls.java -o ./output binary
シンボルをエクスポートghidra-analyze.sh -s ExportSymbols.java -o ./output binary
Ghidra のパスを確認find-ghidra.sh

前提条件

  • Ghidra がインストールされている必要があります。macOS の場合:brew install --cask ghidra
  • Java(OpenJDK 17 以降)が利用可能である必要があります

このスキルは、一般的なインストールパスから Ghidra を自動的に検索します。Ghidra が標準以外の場所にインストールされている場合は、環境変数 GHIDRA_HOME を設定してください。


メインラッパースクリプト

./scripts/ghidra-analyze.sh [options] <binary>

プロジェクトの作成とクリーンアップを処理し、analyzeHeadless をより簡単に利用できるインターフェースを提供するラッパーです。

オプション:

  • -o, --output <dir> - 結果の出力ディレクトリ(デフォルト:現在のディレクトリ)
  • -s, --script <name> - 解析後に実行するスクリプト(複数回指定可能)
  • -a, --script-args <args> - 最後に指定したスクリプトに渡す引数
  • --script-path <path> - スクリプト検索パスを追加
  • -p, --processor <id> - プロセッサー/アーキテクチャ(例:x86:LE:32:default)
  • -c, --cspec <id> - コンパイラ仕様(例:gcc、windows)
  • --no-analysis - 自動解析をスキップ(高速ですが、得られる情報は少なくなります)
  • --timeout <seconds> - ファイルごとの解析タイムアウト
  • --keep-project - 解析後も Ghidra プロジェクトを保持
  • --project-dir <dir> - Ghidra プロジェクトのディレクトリ(デフォルト:/tmp)
  • --project-name <name> - プロジェクト名(デフォルト:自動生成)
  • -v, --verbose - 詳細な出力

組み込みエクスポートスクリプト

ExportAll.java

包括的なエクスポートを実行します。他のすべてのエクスポートを実行し、概要を作成します。初期解析に最適です。

出力ファイル:

  • {name}_summary.txt - アーキテクチャ、メモリーセクション、関数数の概要
  • {name}_decompiled.c - すべての関数を C にデコンパイルしたもの
  • {name}_functions.json - シグネチャと呼び出し情報を含む関数リスト
  • {name}_strings.txt - 検出されたすべての文字列
  • {name}_interesting.txt - セキュリティ関連のパターンに一致する関数
./scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis firmware.bin
ExportDecompiled.java

すべての関数を C の疑似コードにデコンパイルします。

出力: {name}_decompiled.c

./scripts/ghidra-analyze.sh -s ExportDecompiled.java -o ./output program.exe
ExportFunctions.java

アドレス、シグネチャ、パラメーター、呼び出し関係を含む関数リストを JSON としてエクスポートします。

出力: {name}_functions.json

{
  "program": "example.exe",
  "architecture": "x86",
  "functions": [
    {
      "name": "main",
      "address": "0x00401000",
      "size": 256,
      "signature": "int main(int argc, char **argv)",
      "returnType": "int",
      "callingConvention": "cdecl",
      "isExternal": false,
      "parameters": [{"name": "argc", "type": "int"}, ...],
      "calls": ["printf", "malloc", "process_data"],
      "calledBy": ["_start"]
    }
  ]
}
ExportStrings.java

アドレスとともに、すべての文字列(ASCII、Unicode)を抽出します。

出力: {name}_strings.json

./scripts/ghidra-analyze.sh -s ExportStrings.java -o ./output malware.exe
ExportCalls.java

呼び出し元と呼び出し先の関係を示す関数呼び出しグラフをエクスポートします。

出力: {name}_calls.json

含まれる内容:

  • 完全な呼び出しグラフ
  • エントリーポイントの候補(呼び出し元がない関数)
  • 最も頻繁に呼び出される関数
ExportSymbols.java

インポート、エクスポート、内部シンボルを含むすべてのシンボルをエクスポートします。

出力: {name}_symbols.json


一般的なワークフロー

不明なバイナリを解析する
# Create output directory
mkdir -p ./analysis

# Run comprehensive analysis
./scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis unknown_binary

# Review the summary first
cat ./analysis/unknown_binary_summary.txt

# Look at interesting patterns (crypto, network, dangerous functions)
cat ./analysis/unknown_binary_interesting.txt

# Check specific decompiled functions
grep -A 50 "encrypt" ./analysis/unknown_binary_decompiled.c
ファームウェアを解析する
# Specify ARM architecture for firmware
./scripts/ghidra-analyze.sh \
    -p "ARM:LE:32:v7" \
    -s ExportAll.java \
    -o ./firmware_analysis \
    firmware.bin
関数をすばやく一覧表示する
# Just get function names and addresses (faster)
./scripts/ghidra-analyze.sh --no-analysis -s ExportFunctions.java -o . program

# Parse with jq
cat program_functions.json | jq '.functions[] | "\(.address): \(.name)"'
特定のパターンを検索する
# After running ExportDecompiled, search for patterns
grep -n "password\|secret\|key" output_decompiled.c
grep -n "strcpy\|sprintf\|gets" output_decompiled.c
複数のバイナリを解析する
for bin in ./samples/*; do
    name=$(basename "$bin")
    ./scripts/ghidra-analyze.sh -s ExportAll.java -o "./results/$name" "$bin"
done

アーキテクチャ/プロセッサー ID

-p オプションで指定する一般的なプロセッサー ID:

アーキテクチャプロセッサー ID
x86 32 ビットx86:LE:32:default
x86 64 ビットx86:LE:64:default
ARM 32 ビットARM:LE:32:v7
ARM 64 ビットAARCH64:LE:64:v8A
MIPS 32 ビットMIPS:BE:32:default または MIPS:LE:32:default
PowerPCPowerPC:BE:32:default

利用可能なプロセッサーをすべて検索:

ls "$(dirname $(./scripts/find-ghidra.sh))/../Ghidra/Processors/"

トラブルシューティング

Ghidra が見つからない
# Check if Ghidra is installed
./scripts/find-ghidra.sh

# Set GHIDRA_HOME if in non-standard location
export GHIDRA_HOME=/path/to/ghidra_11.x_PUBLIC
./scripts/ghidra-analyze.sh ...
解析に時間がかかりすぎる
# Set a timeout (seconds)
./scripts/ghidra-analyze.sh --timeout 300 -s ExportAll.java binary

# Skip analysis for quick export
./scripts/ghidra-analyze.sh --no-analysis -s ExportSymbols.java binary
メモリ不足

analyzeHeadless スクリプトを編集するか、次を設定してください。

export MAXMEM=4G
誤ったアーキテクチャが検出された

プロセッサを明示的に指定してください。

./scripts/ghidra-analyze.sh -p "ARM:LE:32:v7" -s ExportAll.java firmware.bin

ヒント

  1. まず ExportAll.java を使います - すべての情報が得られ、概要が全体像を把握するのに役立ちます
  2. interesting.txt ファイルを確認します - セキュリティに関係する関数が自動的に強調表示されます
  3. JSON の解析には jq を使います - JSON エクスポートは機械可読になるように設計されています
  4. 逆コンパイルは完璧ではありません - ガイドとして使い、逆アセンブル結果と相互に照合してください
  5. 大きなバイナリの処理には時間がかかります - --timeout を使い、すばやくスキャンする場合は --no-analysis の使用を検討してください

コメント