リバースエンジニアリング新時代へ! 「Ghidra」と「Claude Desktop」をMCPで繋ぐ

はじめに
「Ghidra」はNSA(アメリカ国家安全保障局)が開発したOSSのリバースエンジニアリングツールです。「リバースエンジニアリング」とはバイナリを解析し動作を明らかにする作業で、インシデントレスポンスの際のマルウェア解析やバイナリの脆弱性を見つける際などに行われます。
Ghidraは、商用ツールに負けないデコンパイラやデバッガなどの機能を搭載しており、広く利用されています。このGhidraと「Claude Desktop」をMCP(Model Context Protocol)を用いて繋ぐことで「リバースエンジニアリングを効率化できるのでは」と話題になっています。
今回は、GhidraとClaude Desktopによるリバースエンジニアリングを実際に試してみます。
NSAが開発したGhidra
Ghidraが登場する以前は、デコンパイラが搭載されたGUIで動作するフリーのリバースエンジニアリングツールはなかったため、Ghidraがリリースされた時には大きな衝撃を受けました。
2019年に公開されて以来、リバースエンジニアリングの専門家から高い評価を得ています。次の特徴を持っています。
- デコンパイラ機能
- デバッガ機能
- クロスプラットフォーム対応(Windows、macOS、Linux)
- Java製のExtensionによる機能拡張
- Python製のスクリプトによる機能拡張
- 複数人での共同作業をサポート
これらの機能はマルウェア解析や脆弱性調査など、様々なリバースエンジニアリングに活用されています。
Claude DesktopとMCP
Claude DesktopはAnthropic社が開発した大規模言語モデル(LLM)のデスクトップアプリケーションです。MCPはAIを搭載/未搭載のツールを連携させるためのプロトコルで、Anthropic社が2024年10月に提唱したものです。MCPの公式ドキュメントには「AIアプリケーション向けのUSB-Cポートのようなもの」と記載されています。
USB-CポートがPCとデバイスを繋ぐように、MCPはAIアプリケーションと外部ツールを繋ぎます。MCPを用いることで、Claude DesktopなどのAIアプリケーションと外部ツールの間でコンテキストを共有し、双方向の通信を行えます。
2025年に入ってから、実際にMCPを活用したサービスやOSSが増えてきています。4月4日にはGitHub公式のMCPサーバが公開され、4月8日にはNotion公式のMCPサーバが公開されました。
GhidraとClaude Desktopを繋ぐ
GhidraMCPというOSSのGhidra Extensionを使うと、GhidraにMCPサーバを拡張機能として組み込むことができます。ここでは、GhidraMCPを用いてGhidraとClaude Desktopを接続する方法を紹介します。
GhidraMCPの開発者LaurieWiredさんによる紹介動画はこちら。
Pythonの準備
GhidraMCPのMCPサーバ部分はPythonで実装されています。リポジトリ内に必要なライブラリが記載されたrequirements.txt
があります。次のコマンドで記載のライブラリをインストールしてください。なお、ここではパッケージマネージャーにpip
を使用していますが、お好みのものを使用して問題ありません。
$ git clone https://github.com/LaurieWired/GhidraMCP.git $ cd GhidraMCP $ pip install -r requirements.txt
Ghidraの準備
GhidraMCPには、Pythonスクリプトの他にJavaで実装された「Ghidra Extension」が含まれています。ここではGhidra Extensionの設定方法を紹介します。Ghidraのインストール方法は公式ドキュメントを参照してください。
まず、Ghidra ExtensionをリポジトリのReleasesからZIPファイル(GhidraMCP-release-X-X.zip
)をダウンロードしてください。
ダウンロードしたZIPファイルを解凍すると、ZIPファイルのGhidra Extensionのファイル(GhidraMCP-X-X.zip
)が入っています。このファイルを解凍する必要はありません。ZIPのままGhidraに読み込ませることができます。
Ghidraを起動してFile
メニューからInstall Extensions
を選択してください。新たに表示されたウィンドウで[+
]ボタンをクリックしてください。
Select Extension
というウィンドウが表示されたら、先ほど解凍したGhidraMCP-X-X.zip
を選択してください。
ウィンドウにGhidraMCP
が表示されるのでGhidraMCP
にチェックを入れ、[OK
]ボタンをクリックし、Ghidraを再起動してください。
Claude Desktopの準備
Claude DesktopをGhidra MCPクライアントとして設定するには、MCPサーバのURLやGhidraMCPのPythonスクリプトのパスを指定する必要があります。
Claude Desktopを起動し、設定画面を開いてください。開発者
タブを選択して構成を編集
をクリックします。設定ファイルclaude_desktop_config.json
の場所がファイルエクスプローラーで開かれます。
claude_desktop_config.json
をテキストエディタで開き、次の内容を書き込んでください。bridge_mcp_ghidra.py
のパスにはReleasesからダウンロードしたZIPファイルを解凍したフォルダ内にあるbridge_mcp_ghidra.py
のパスを指定してください。
{ "mcpServers": { "ghidra": { "command": "<Pythonのパス>", "args": [ "<GhidraMCPのパス>/bridge_mcp_ghidra.py", "http://127.0.0.1:8080/" ] } } }
バイナリを確認する
アンチディスアセンブルを実装したバイナリを弊社のGitHubリポジトリで公開しています。ここでは、このバイナリをClaude Desktopを繋いだGhidraに読み込んで解析してみます。
バイナリをダウンロードする
まず、リポジトリのReleasesからbinaries.zip
をダウンロードしてください。
解凍するとarm32
フォルダとarm64
フォルダがあるはずです。ここではarm64
フォルダ内の
次のコードをARM64向けにビルドしたのがbogus-control-flow
です。このコードには条件分岐が存在しますが、a
、b
は定数でsqrt(a*a+b*b)
の計算結果は一意に定まります。そのため、この条件式は常に偽となりif文内のコードは実行されません。ここに命令として実行できないバイト列を埋め込むことでディスアセンブルを妨害しています。
#include <math.h> #include <stdio.h> int main() { int a = 3; int b = 2; int c = 5; if (c < sqrt(a*a+b*b)) { __asm__ volatile( ".long 0x01020304\n" ".long 0x05060708\n" ); } printf("Hello, world!\n"); return 0; }
バイナリをGhidraで読み込む
Ghidraを起動し、File
メニューよりNew Project
を選択します。ダイアログに沿ってプロジェクト名を入力し、プロジェクトを作成してください。
プロジェクトを作成したら、File
メニューよりImport File
を選択します。arm64
フォルダ内のbogus-control-flow
を選択してください。正常にバイナリを読み込めていると、次のような画面が表示されます。なお、ここではプロジェクト名をmcp-test
としています。
bogus-control-flow
をクリックするとCodeBrowser
ウィンドウが表示され、ディスアセンブル処理が実行されます。main関数のディスアセンブル結果を確認すると、アセンブリ命令の中にバイト列が存在することを確認できます。
Claude Desktopでバイナリを解析する
Claude Desktopにmain関数中のバイト列について質問してみましょう。私は「main関数にはディスアセンブルできない箇所(LAB_0010082c)が存在します。この原因を教えてください」と質問してみました。なお、Claude DesktopからGhidraを操作するに当たっては警告が出るため「このチャットで許可する」もしくは「一度だけ許可」を選択し、Ghidraの実行を許可してください。
その結果、下図のような回答が返ってきました。
このケースではsqrt(13.0)を計算して5.0と比較し、条件が真であれば「Hello, world!」を表示して正常に終了するというプログラムフローが見えます。しかし、条件が偽の場合(つまりsqrt(13.0)が5.0より大きい場合)、ディスアセンブラは続くコードを正確に解析できなくなっています。
sqrt(13.0)は約3.606なので実際には条件は真となり、不正なデータが存在する部分には実行フローが到達しないはずです。これは意図的に配置された難読化技術の一部かもしれません。
条件式の計算結果が常に一意に定まり、バイト列の部分は実行されないこと、難読化が施されている可能性があると判断できています。
元のC言語のコードでは条件式は常に偽になりますが、デコンパイル結果では常に真になるように解釈されています。条件式の記述、条件式に続く処理が実態に沿っており、元のコードとは異なりますが、これは正しいデコンパイル結果です。これにより、Claude Desktopはデコンパイル結果を正確に解釈できていると分かります。
おわりに
今回は、MCPを用いてGhidraとClaude Desktopを接続し、バイナリの解析を行ってみました。AIツールをリバースエンジニアリングツールに接続することで、専門家でなくてもバイナリの解析をある程度行うことができるようになリました。また、専門家がリバースエンジニアリングを行うときには、作業を従来より効率的に進められるでしょう。
AIツールにはClaude Desktopを使用しましたが「Cline」や「Cursor」などのAIを搭載したエディタを接続することもできます。Ghidraはバイナリの解析を効率化するための「Ghidra Script」と呼ばれるPythonによるスクリプティング機能が搭載されています。バイナリ解析の補助だけでなく、Ghidra Scriptの実装にもこれらのエディタを使用することで、バイナリの脆弱性を効率的に発見できるのではと私は考えています。今年のセキュリティカンファレンスでは、Ghidra+Cursor/Clineで効率的にバイナリの脆弱性を発見する発表が増えるのではないかと予想しています。
MCPを用いてAIツールを接続することで、色々なセキュリティツールを用いた作業が効率的に行える未来が楽しみです。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 32ビット/64ビットの両方のARM環境で有効なディスアセンブルを妨害するテクニック
- 32ビットのARM環境のみで有効なディスアセンブルを妨害するテクニック
- パッチを当てるPythonスクリプトを生成するIDAプラグイン「genpatch」を作った話
- セキュアブレイン、Androidアプリ解析ツール「JEBインタラクティブAndroidデコンパイラ」の販売を開始
- セキュリティ調査向けLinuxディストリビューション「Kali Linux 2024.3」リリース
- 自動運転システム搭載車にミサイル技術を利用する三菱
- MySQL Workbenchを使ってデータモデリングを学んでみよう
- 「Krita」と「Python」でプラグインを作ろう
- 侵入テストなどに向けたLinuxディストリビューション「Gnoppix 24.1」リリース
- セキュリティ調査向けLinuxディストリビューション「Kali Linux 2024.4」リリース