Ghidra とは — NSA 製 OSS リバースエンジニアリングツールの仕組みと使い方 のサムネイル

Ghidra とは — NSA 製 OSS リバースエンジニアリングツールの仕組みと使い方

⏱ 約 17 分 view 573 like 0 LOG_DATE:2026-05-11
目次 / TOC

Ghidra (ギドラ) は NSA が内部利用していたリバースエンジニアリング・スイートで、2019 年 RSA Conference で Apache License 2.0 として OSS 公開された。Disassembler と「無料の Decompiler」を一般に開放した点で IDA Pro 独占の RE 市場に風穴を開け、マルウェア解析・CTF・ファームウェア解析の裾野を一気に押し広げた。本稿では SLEIGH と P-Code による多アーキ対応の仕組み、典型ワークフロー、他ツールとの比較、自動化、限界までを通しで扱う。

▸ セキュリティ初学者へ — まずこの 3 つだけ

難しく見えても本質は次の 3 つだけ。(1) Ghidra は 「機械語を人間が読める形に翻訳するツール」。ソースコードが手に入らない exe / ELF / firmware を分解して中身を読める。(2) 2019 年に NSA が無料公開して以降、これまで有料 (数十万円) だった「Decompiler (擬似 C への変換)」が 誰でも無料で使えるようになった、というのが業界を変えた最大の出来事。(3) 主な使い道は マルウェア解析 / CTF / IoT ファームウェア解析 / 脆弱性パッチ差分 の 4 つ。— ここを土台に各章を順に開いていけばいい。

01

Ghidra が解いている問題 — リバースエンジニアリングとは #

Reverse Engineering (RE) はコンパイル済み実行ファイル・ファームウェア・オブジェクトファイルから、元の設計意図と動作を逆方向に復元する作業の総称。ソースコードが手に入らない状況で「このマルウェアは何をするのか」「このプロプライエタリプロトコルはどう動くのか」「このパッチで何が直されたのか」を答える必要がある時に使う。

▸ かみ砕いて言うと — RE は「料理を食べて、レシピを再現する」

料理人がレシピなしの料理を食べて 「砂糖が小さじ 2、塩はひとつまみ…」と材料と工程を逆推測するのと同じ作業。プログラムは 「機械語のバイト列」という料理として出てくるので、(1) アセンブリに分解 (= 食材を 1 つずつ取り出す) → (2) 擬似 C コードに再構築 (= レシピの形に組み直す) → (3) 関数名や型に意味を貼る (= 「これは下ごしらえの工程」とコメントを書く)、という 3 段階で「読める形」に戻す。Ghidra はこの 3 段階を 1 つの GUI で支援するツール。

機械語 (例: x86-64 の 48 83 EC 28 ...) は人間には読めない。RE ツールは複数の層で「読める形」に再翻訳する:

1. 生バイナリ
そのままでは意味不明な機械語バイト列。
2. Disassembly (アセンブリ)
sub rsp, 0x28; mov rax, [rbp-0x10]; ... のように命令単位に分解。
3. Decompilation (擬似 C)
int main() { int x = ...; if (x > 0) {...} } のように高水準構造を回復。
4. Annotated graph
関数間呼び出し / 制御フロー / クロスリファレンスを可視化。

Ghidra は (1)→(4) のすべてを 1 つの GUI で提供し、逐次的に意味を貼り付ける作業 (関数の改名・型注釈・コメント) を蓄積できるプロジェクト管理機能を持つ。「手作業の知見をプロジェクトに残せる」プロセス設計が、解析の継続性と共有を支える本質。

02

歴史 — NSA 内部ツールから 2019 OSS 公開へ #

Ghidra の起源は 1999 年頃の NSA 内部開発。SIGINT 業務における外国製・国産問わず暗号化通信ソフトや組み込み機器の解析のため、Java で書かれたクロスプラットフォーム RE スイートとして育てられた。機密扱いの内部ツールだったが、Edward Snowden が 2013 年に NSA 文書をリークした際に「Ghidra」の名称と一部スクリーンショットが世界に知られた経緯がある。

転機は 2019 年 3 月。NSA の Cybersecurity Directorate のディレクター Rob Joyce が RSA Conference で公開発表し、GitHub に Apache License 2.0 でソース・バイナリを公開した。

理由は複数説明されている:

  • 学術 / 研究コミュニティへの貢献 (NSA の "Cybersecurity for the Nation" 路線)
  • 国家として人材育成への投資 — RE 人材は供給不足、ツール公開で裾野を広げる
  • 既に内部リーク文書で名前と機能が知られていた — 完全公開した方が透明性で得
  • 競合 (IDA Pro 等) との人材獲得競争 — 採用面接で「Ghidra なら知ってます」というキャリア入口を作れる
▸ 「NSA 製だから危険」説への決着

初版 9.0 はバックドアの噂を疑う声もあったが、Apache 2.0 で完全公開済み + 巨大な OSS コミュニティが調査済み で、実用上は安全と扱われている。2026 年現在の最新は 11.x 系、年に数回のリリースが続く。

03

アーキテクチャ — SLEIGH と P-Code が支える多アーキ対応 #

Ghidra の技術的に最も独自な部分は、SLEIGH という独自プロセッサ仕様記述言語と P-Code という中間表現 (IR) の組み合わせ。x86 でも ARM でも MIPS でも PowerPC でも RISC-V でも同じ解析エンジンが動くのはこの 2 つのおかげ。

▸ かみ砕いて言うと — SLEIGH と P-Code は「全 CPU 共通の翻訳機」

世界には x86 / ARM / MIPS / RISC-V など 無数の CPU 言語がある。普通の解析ツールは 「x86 専用」「ARM 専用」と別々の翻訳機を用意するが、Ghidra は (1) SLEIGH = 各 CPU の「文法書」 + (2) P-Code = 翻訳した結果を統一する「共通言語 (エスペラント語)」という 2 段構成。だから珍しい IoT CPU でも SLEIGH 仕様を 1 個書けば即対応できるし、解析プラグインは P-Code レベルで書けば 全 CPU で同じものが動く。これが「Ghidra は珍しい CPU に強い」と言われる仕組み。

① Disassembly — 機械語 → アセンブリ
SLEIGH 仕様 (x86.sla / ARM.sla / ...) がバイトパターンを解釈。48 83 EC 28sub rsp, 0x28 (x86-64)、E5 2D E0 04str lr, [sp,#-4]! (ARM)。
② P-Code への lift
アーキ固有を消した中間表現に変換。sub rsp, 0x28INT_SUB(rsp, 0x28) → COPY → rsp のような P-Code op の連鎖。x86 でも ARM でも同じ集合に正規化。
③ データフロー / 制御フロー解析
関数境界 / Basic Block / Use-Def 連鎖 / SSA 形式 / レジスタ生存解析 / 定数伝播。P-Code レベルで「stack に何が入っているか」「ループ条件は何か」を推定。
④ Decompiler — 擬似 C へ再構築
局所変数 / if / for / while / switch / 関数呼び出しを構造化、Hex-Rays に近い品質の C 風表示。商用と無料の最大の差だった部分を Ghidra が無料化した最大の功績。

SLEIGH の意義:

  • 新しい ISA への対応が「プログラム書き換え」ではなく「仕様ファイル追加」で済む
  • 無名・独自プロセッサ (組み込み機器 / 古い ASIC / 一部 IoT) でも、SLEIGH 仕様を書けば Ghidra で解析可能
  • コミュニティ contribute で 6502 / 8086 / SH4 / レトロ機器の SLEIGH 定義が公開されている

P-Code の意義:

  • x86 で書いた解析プラグインが ARM でも動く — アーキ依存を上位レイヤから消す
  • データフロー解析 / シンボリック実行 / 抽象解釈を 1 度書けば全アーキで使える
  • angr / Triton などのシンボリック実行フレームワークも P-Code 経由で統合できる
04

代表機能 — 解析者が日常的に使うもの #

Ghidra は「これがウリ」と一言で説明しづらい統合環境だが、解析者が日常的に使う主な機能は次の通り。

機能 何をする
Code Browser バイナリ全体の中央 UI。Disassembly / Decompiler / シンボル / 参照を 1 画面に統合
Decompiler アセンブリから擬似 C コードを再構築 (Ghidra の最大の魅力)
Function Graph 関数の制御フローを Basic Block の有向グラフで可視化
String Search バイナリ内の文字列定数を抽出 → マルウェアの URL / プロセス名 / API 関数名の発見
Symbol Tree 関数・グローバル変数・名前空間を tree で整理
Cross References (xrefs) この関数 / 変数を呼んでいる箇所を双方向に辿る
Data Type Manager 構造体 / 共用体 / 列挙体を定義してメモリ領域に型を貼る
Function ID / FidDb 既知ライブラリ関数 (libc / OpenSSL / .NET 等) のシグネチャマッチで自動命名
Bookmark 「ここ重要」をマーク、後で戻れるように
Version Tracking 2 つのバイナリ (パッチ前後 / 異なる亜種) の関数を対応付け
Headless Analyzer GUI を介さず CLI でプロジェクト作成・解析・スクリプト実行 (CI 統合)
Script Manager Python (Jython) / Java で機能拡張
Collaborative Server Ghidra Server を立てて複数解析者がリアルタイム共有解析

「何もない状態のバイナリに、解析者が逐次的に意味を貼り付けていく」プロセスを支える設計が一貫している。1 セッションで終わらない解析でも、プロジェクトファイル (.gpr) に全状態が保存され、翌日同じ場所から続けられる。

05

典型ワークフロー — Import から Decompile まで #

実際の解析セッションの流れ:

1. プロジェクト作成
File → New Project で Non-Shared / Shared を選ぶ。
2. バイナリを Import
PE / ELF / Mach-O / Raw を自動判別。"Format" "Language" "Compiler" は大抵 auto-detect で OK。
3. Auto-Analyze
デフォルト全有効で数秒〜数分。Function ID / Stack / Decompiler Parameter ID / DWARF が走る。
4. main / entry point から開始
Symbol Tree → main で出発点へジャンプ。Code Browser で Disassembly と Decompiler を並べて読む。
5. 改名・型付け・コメント
L で変数 / 関数を改名、Ctrl-L で型を貼る、; でコメント。逐次的に意味を貼り付ける。
6. xrefs で展開
Ctrl-Shift-F で呼び出し元 / 参照を辿る。文字列やシステムコール (printf / WriteFile / connect) を起点に。
7. スクリプトで自動化 → 保存
Script Manager で定型作業を Python / Java 化。Shared Project + Ghidra Server で共有保存。
▸ はじめての人向け — 最初の 30 分でやること

上の 7 ステップは本格運用向け。初めて Ghidra を開いたとき何をすればいいか分からない、という人向けの最短コース。(1) サンプル exe を Import (CTF 用の Easy バイナリ or 自分でビルドした C 実行ファイル)。(2) Auto-analyze を全 ON のままで実行 (数秒〜数分)。(3) 左の Symbol Tree から main をダブルクリック(4) 右側の Decompiler ペインで擬似 C コードを読む(5) 意味が分かった変数を L キーでリネーム / ; でコメントを書くこれだけで「機械語が読める」体験ができる。慣れたら CTF の Reverse カテゴリ Easy 問題から本格的に学習を始めるのが最短ルート。

▸ Decompiler の品質は「8 割正しい、2 割誤訳」

スタックポインタの追跡ミス / レジスタ生存範囲の誤認 / 関数境界の誤判定が代表的な失敗パターン。疑わしい箇所はアセンブリに戻って検証するのが定石。右クリック → "Override Function Signature" や "Edit Function" で型を正すと、急に Decompiler 出力が良くなる。

生産性が変わる必須ショートカット
# Code Browser での主要キー L シンボル (関数/変数) のリネーム ; コメント追加 Ctrl-Shift-E 関数のシグネチャ編集 Ctrl-Shift-F Cross References を一覧 G アドレス指定でジャンプ N グラフを次の関数へ Ctrl-L データ型を割り当て
06

他の RE ツールとの比較 #

Ghidra は「唯一の RE ツール」ではない。用途と好みで使い分ける現代の主要ツール:

ツール 価格 Decompiler 強み 弱み 適性
Ghidra (NSA / OSS) 無料 ○ 標準装備、多アーキ (SLEIGH) 無料で IDA 相当 / 珍しい ISA / Headless 自動化 / Shared Project Java の起動コスト / UI に癖 / プラグイン少 初学者 / 個人 / 大量サンプル / CI
IDA Pro (Hex-Rays, 1991-) $$$ (数千〜) ◎ Hex-Rays、品質トップ (別売) Decompiler 品質最高 / 業界デファクト / プラグイン豊富 高価 / 珍しい ISA が別売り 商用 / 大企業 SOC / 高品質要求案件
Binary Ninja (Vector 35, 2016-) $ ($299〜) ○ HLIL、多段中間表現 UI / UX 洗練 / API 設計が綺麗 / 起動・操作が速い 無料版は制限多 / ISA 対応中程度 プロ個人 / API ヘビーユーザ
radare2 / Cutter (OSS, 2006-) 無料 △ pdc / r2ghidra で補強 CLI 完結 / Unix 哲学 / 多 ISA / パイプ連携 学習曲線急 / Decompiler 弱い CLI 派 / 自動化 / CTF
▸ かみ砕いて言うと — 入門なら Ghidra 一択でよい

「IDA Pro」(数十万円) と「Ghidra」(無料) のどちらを選ぶか迷うが、2026 年現在、初学者の答えは Ghidra 一択。理由: (1) 無料で IDA に近い品質の Decompiler が使える(2) 全 CPU 対応で珍しい IoT も解析可能(3) Headless モードで自動化できる。Ghidra で物足りなくなる頃にはプロ仕事をしているはずで、その時に IDA Pro / Binary Ninja を会社経費で買えばよい。「Ghidra で始めて、必要なら IDA を買う」が現代の典型的な学習ルート。

▸ 使い分けの指針

Ghidra で始めて、必要なら IDA を買う が現代の典型的な学習ルート。最初から IDA を買う必要はない、というのが Ghidra が業界に与えた最大の影響。objdump / nm / readelf / strings は補助ツールとして併用 — 完結した分析環境ではない。

07

使われ方 — 実用文脈 #

Ghidra の主な実用文脈を 6 つ。

(1) マルウェア解析 サンプル受領 → Import → Auto-analyze → Strings で URL / IP / API 名抽出 → 怪しい関数を Decompile して挙動を読む。Sunburst (SolarWinds, 2020)WannaCry の公開直後から Ghidra 解析記事が多数。Initial Triage を Ghidra で済ませてから動的解析 (Cuckoo Sandbox / x64dbg) に渡すのが定番。

(2) 脆弱性研究 / パッチ差分 CVE 公開後、Microsoft / Adobe 等のパッチを Before / After で diff し、どこが直されたかを特定する。Ghidra の Version Tracking が関数単位の対応付けと差分表示を支援。BinDiff / Diaphora が併用される。

(3) CTF CTF の Reverse カテゴリは Ghidra が事実上の標準。stripped ELF からフラグを取り出す、Rust / Go バイナリの構造を解く、カスタム VM を逆コンパイルする、といった問題で Ghidra のフレキシブルさが効く。

(4) ファームウェア / IoT ルータ / IP カメラ / 組込デバイスの firmware を binwalk で展開 → ELF / raw bin 抽出 → Ghidra で解析。MIPS / ARM / RISC-V の処理能力、SLEIGH で珍しい組込 CPU にも対応可能な点が活きる。

(5) プロトコル解析 プロプライエタリなネットワークプロトコル (ゲーム / SCADA / 古い独自プロトコル) の挙動を、実装バイナリから逆算してパケット形式を復元する。Cross-references で受信処理から辿るのが定石。

(6) ライセンス検証回避 (法的グレーゾーン) シェアウェアの「シリアル番号検証」を逆算する古典的ユースケース。

▸ 法的に触れる前に — Crack 配布は著作権侵害

正規目的の研究は OK だが、商用ソフトの crack 配布は著作権侵害。自分が買ったソフトの自分用の調査にとどめるべき。マルウェア解析でも、検体は VirusTotal / Malshare / MalwareBazaar 等の正規ソースから入手する。

08

Headless Analyzer とスクリプト — 自動化の話 #

Ghidra は GUI を介さず CLI から動かせる (analyzeHeadless)。大量サンプルの自動解析 / CI 統合 / バッチ処理で使う。

analyzeHeadless で CI / バッチ解析
# プロジェクト作成 + Import + Auto-analyze $ analyzeHeadless /path/to/project ProjectName \ -import sample.exe \ -postScript MyAnalysisScript.py # 既存プロジェクトに対してスクリプトだけ実行 $ analyzeHeadless /path/to/project ProjectName \ -process sample.exe \ -scriptPath ./scripts \ -postScript ExtractStrings.py
Python (Jython) スクリプト — 全関数とその呼び出し元を列挙
# Script Manager → New Python で書く fm = currentProgram.getFunctionManager() for func in fm.getFunctions(True): print("Function:", func.getName()) for ref in func.getEntryPoint().getReferenceIteratorTo(): print(" called from:", ref.getFromAddress())
Strings から URL / IP らしいものを抽出
import re listing = currentProgram.getListing() for data in listing.getDefinedData(True): if data.hasStringValue(): s = data.getValue() if re.search(r"https?://|\b\d+\.\d+\.\d+\.\d+\b", str(s)): print(data.getAddress(), s)
▸ コミュニティスクリプト集

Ghidra-Scripts (GitHub の複数 repos): Find Crypt / String Decryption / Anti-VM 検知。Ghidra-CTF: CTF 向けの一般化スクリプト。Ghidra Bridge: 外部 CPython (PyPI ライブラリ使い放題) と Ghidra Jython を橋渡し → angr / capa / yara を統合できる。

09

限界とコツ — 「Decompiler は完璧ではない」 #

Ghidra (および全 RE ツール) の限界:

  • Decompiler の出力は近似 — スタック誤認 / レジスタの型推論失敗 / カーネルコード / 高最適化 (LTO/PGO) で誤訳が起きる。アセンブリに戻って検証するのが原則
  • Packing / Obfuscation — UPX 程度なら自動展開できるが、商用パッカー (VMProtect, Themida) や手作りパッカーは事前に動的 unpacking (= プロセスダンプ) してから渡す必要がある
  • JIT / JVM / .NET / Python — 機械語ではなく中間バイトコード — dnSpy (C#) / jadx (Java) / Decompyle3 (Python) など専用ツールが向く
  • Stripped binary — シンボル / デバッグ情報がない場合、関数名 / 変数名はすべて自分で貼り直す
  • 巨大なバイナリ — 100MB 級だと Auto-analyze に数十分〜数時間、GUI も重くなる。Headless で部分処理する
  • JVM の起動コストghidraRun の起動だけで 10〜20 秒
  • UI に独特の癖 — IDA / Binary Ninja から来た人は最初戸惑う
▸ 意識すべき — Decompiler は「8 割正しい、2 割誤訳」

上の限界のうち最も重要な点が「Decompiler の精度」。Decompiler が出した擬似 C コードは 「機械翻訳」と同じで、文法的には読めても 意味的に間違っていることがよくある「Decompiler の出力を鵜呑みにしない / 怪しい箇所はアセンブリに戻って確認する」のが鉄則。逆に 「ここは構造体っぽい」「ここはこの型」と人間が教えてあげると Decompiler 出力が劇的に良くなる — つまり 解析者と Ghidra の「対話」で精度が上がるツール、と理解する。

▸ 現場の知恵
  • 小さく試す — 不明な関数は 「呼び出し元から逆に辿る (xrefs)」 が最も効率的。main からトップダウンは行き詰まりがち
  • シグネチャ DB を活用 — Function ID でライブラリ関数を自動命名すると、意味的負荷が一気に減る
  • 構造体を貼る — 「ここはおそらく XYZ 構造体のメモリ」と気づいたら型を貼る → Decompiler 出力が劇的に良くなる
  • コメントと改名はケチらない — 半年後の自分が読む前提
  • スクリプトで定型化 — 2 回やった作業はスクリプトに
10

関連ツールとエコシステム #

Ghidra 単体ではなく周辺ツールと組み合わせるのが現代の解析。

役割 ツール
動的解析 x64dbg / OllyDbg / GDB / WinDbg / Frida
サンドボックス Cuckoo Sandbox / Joe Sandbox / Hybrid Analysis / Any.Run
ファームウェア展開 binwalk / firmware-mod-kit / unblob
Diff / Version Tracking BinDiff (Google) / Diaphora
シンボリック実行 angr / Triton / KLEE
シグネチャ / YARA yara / yarGen / capa
アンパッカー unipacker / scyllahide / Volatility (メモリダンプ)
マルウェア配信プラットフォーム VirusTotal / Malshare / MalwareBazaar
解析ノート Obsidian / Notion / Markdown + Git

Ghidra Bridge で CPython 側から Ghidra API を叩けるようにし、angr (シンボリック実行) や capa (能力検出) の Python ライブラリと統合するのが上級者の使い方。

▸ まとめ

Ghidra は SLEIGH によるプロセッサ仕様の宣言的記述 + P-Code 中間表現 + 共通の解析エンジンで、x86 / ARM / MIPS / PowerPC / RISC-V / 珍しい組込 CPU まで 1 つのツールで解析できる。最大の歴史的意義は 「無料 + OSS の Decompiler を一般に開放した」こと。RE 学習のスタートラインを価格ではなく「興味と時間」だけにした影響は計り知れない。RE を学び始めるなら Ghidra から、必要に応じて IDA Pro / Binary Ninja / radare2 を併用するのが現代の標準ルート。

𝕏 ポスト B! はてブ