darallium/r2-copilot
If you are the rightful owner of r2-copilot and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
radare2-mcp-server is a Multi-Agent Collaboration Protocol (MCP) server designed for the radare2 reverse engineering framework.
radare2-mcp-server
radare2-mcp-server
は、強力なリバースエンジニアリングフレームワークである radare2 のための Multi-Agent Collaboration Protocol (MCP) サーバーです。
インストール
- リポジトリのクローン
git clone https://github.com/your-repo/radare2-mcp-server.git
cd radare2-mcp-server
- 依存関係のインストール
プロジェクトでは
uv
を使用して依存関係を管理しています。
uv sync
- radare2のインストール
r2pipe
が正しく動作するためには、radare2
がシステムにインストールされている必要があります。
mkdir -p ~/.local/src/
cd ~/.local/src/
git clone https://github.com/radareorg/radare2 --depth 1
radare2/sys/install.sh
see. https://github.com/radareorg/radare2
使用方法
サーバーを起動するには、次のコマンドを実行します。
./start.sh
これにより、標準入出力(stdio)を介して通信する MCP サーバーが起動します。 サーバーは、クライアントからのリクエストを待ち受け、radare2 のコマンドを実行し、結果を返します。
gemini-cliで利用するには、 ~/.gemini/settings.json
を以下の通りに追記してください。
{
/*
...
*/
"mcpServers": {
/*
...
*/
"radare2-mcp": {
"command": "/path/to/radare2-mcp-server/start.sh"
}
}
}
解析ワークフロー
一般的なバイナリ解析は、以下のステップで進めることが推奨されます。 なお、gemini-cli等を利用する場合は具体的なコマンドを暗記する必要はなく、自然減での入力が推奨されます。
- セッションの開始
まず、解析対象のファイルに対してradare2セッションを開始します。これにより、以降の操作で参照するセッションIDが発行されます。
コマンド:
create_session(file_path='<ファイルへの絶対パス>')
例:
/home/kali/ctf/iris/sqlate/vuln を解析する場合
print(default_api.create_session(file_path='/home/kali/ctf/iris/sqlate/vuln'))
Note: このコマンドの応答に含まれる session_id は、後続の全てのコマンドで必要になります。
- 初期静的解析(情報収集)
セッションが開始されたら、バイナリの基本的な情報を収集します。これらのコマンドは並行して実行可能です。
-
バイナリの基本情報を取得:
get_binary_info(session_id='<session_id>')
(アーキテクチャ、ビット数、ファイル形式などを確認します) -
セキュリティ機構の確認:
check_security(session_id='<session_id>')
(NX, PIE, Canaryなどの緩和機能が有効かを確認します) -
文字列のリストアップ:
get_strings(session_id='<session_id>')
(バイナリに埋め込まれた文字列を抽出し、プログラムの機能や目的を推測する手がかりを探します) -
インポート関数のリストアップ:
get_imports(session_id='<session_id>')
(外部ライブラリからどの関数を呼び出しているかを確認します。systemやstrcpyのような危険な関数の有無は重要な指標です)
- 詳細解析
次に、radare2の強力な自動解析機能を実行します。これにより、関数、基本ブロック、コードの相互参照などが特定されます。
コマンド:
analyze_all(session_id='<session_id>')
Note: この処理は、バイナリのサイズによっては時間がかかる場合があります。
- 関数の調査
自動解析が完了したら、特定された関数をリストアップし、プログラムの全体像を把握します。
-
関数一覧の表示:
list_functions(session_id='<session_id>')
-
特定の関数の逆アセンブル:
disassemble_function(session_id='<session_id>', address='<関数名 or アドレス>')
(例えば、プログラムの起点であるmain関数を調べるには address='sym.main' を指定します)
- 高度な操作(生コマンドの実行)
より複雑な調査や、特定のツールが期待通りに動作しない場合、execute_command
を使用してradare2の任意のコマンドを直接実行できます。
コマンド:
execute_command(session_id='<session_id>', command='<radare2コマンド>')
# "login" という文字列を名前に含む関数を検索する
print(default_api.execute_command(command='afl | grep login', session_id='...'))
API リファレンス
サーバーは、以下のツールを公開しており、それぞれが特定の radare2 の機能に対応しています。
セッション管理
create_session
: 新しい radare2 セッションを開始します。list_sessions
: アクティブなセッションを一覧表示します。close_session
: セッションを閉じます。switch_session
: 現在のセッションを切り替えます。
解析
analyze_all
: バイナリ全体を解析します (aa
)。analyze_function
: 特定のアドレスの関数を解析します (af
)。list_functions
: 解析された関数を一覧表示します (afl
)。get_function_info
: 関数の詳細情報を取得します (afi
)。get_xrefs_to
: 特定のアドレスへのクロスリファレンスを取得します (axt
)。get_xrefs_from
: 特定のアドレスからのクロスリファレンスを取得します (axf
)。
バイナリ情報
get_binary_info
: バイナリに関する包括的な情報を取得します (iI
)。get_sections
: セクションを一覧表示します (iS
)。get_symbols
: シンボルを一覧表示します (is
)。get_strings
: 文字列を一覧表示します (iz
,izz
)。get_imports
: インポートされた関数を一覧表示します (ii
)。get_entrypoint
: エントリポイントを取得します (ie
)。check_security
: セキュリティ機能(NX, PIE など)を確認します。
ディスアセンブリ
disassemble
: 命令をディスアセンブルします (pd
)。disassemble_function
: 関数全体をディスアセンブルします (pdf
)。print_hex
: 16進ダンプを表示します (px
)。print_string
: アドレスにある文字列を表示します (psz
)。
ナビゲーション
seek
: 特定のアドレスに移動します (s
)。seek_relative
: 相対的に移動します。get_current_address
: 現在のアドレスを取得します。set_block_size
: ブロックサイズを設定します (b
)。
検索
search_bytes
: バイトパターンを検索します (/x
)。search_string
: 文字列を検索します (/
)。search_rop_gadgets
: ROP ガジェットを検索します (/R
)。
書き込み
write_hex
: 16進数値を書き込みます (wx
)。write_assembly
: アセンブリ命令を書き込みます (wa
)。write_nop
: NOP 命令を書き込みます。
デバッガ
continue_execution
: プログラムの実行を継続します (dc
)。step_into
: ステップイン実行します (ds
)。step_over
: ステップオーバー実行します (dso
)。set_breakpoint
: ブレークポイントを設定します (db
)。list_breakpoints
: ブレークポイントを一覧表示します。get_registers
: レジスタの値を取得します (dr
)。set_register
: レジスタの値を設定します。
フラグ
list_flags
: フラグ(ラベル)を一覧表示します (f
)。create_flag
: フラグを作成します。
設定
get_config
: 設定値を取得します (e
)。set_config
: 設定値を設定します。execute_command
:生の radare2 コマンドを実行します。