r2-copilot は、強力なリバースエンジニアリングフレームワークである radare2 のための Multi-Agent Collaboration Protocol (MCP) サーバーです。
このリポジトリはサードパーティーツールになります。オフィシャルのmcpツールは以下になります。
- r2mcp - the official radare2 mcp
- r2ai - the official r2ai
※ r2pmに追加してもらえました!r2pm -Uci r2-copilotでインストール可能です。
- リポジトリのクローン
git clone https://github.com/your-repo/r2-copilot.git
cd r2-copilot- 依存関係のインストール
プロジェクトでは
uvを使用して依存関係を管理しています。
uv syncr2pipe が正しく動作するためには、radare2 がシステムにインストールされている必要があります。
mkdir -p ~/.local/src/
cd ~/.local/src/
git clone https://github.com/radareorg/radare2 --depth 1
radare2/sys/install.shwindowsの場合、ビルド済みバイナリをダウンロードしてきてPATHを通す方が早いです。
see. https://github.com/radareorg/radare2
サーバーを起動するには、次のコマンドを実行します。
./start.shこれにより、標準入出力(stdio)を介して通信する MCP サーバーが起動します。 サーバーは、クライアントからのリクエストを待ち受け、radare2 のコマンドを実行し、結果を返します。
gemini-cliで利用するには、 ~/.gemini/settings.json を以下の通りに追記してください。
{
/*
...
*/
"mcpServers": {
/*
...
*/
"r2-copilot": {
"command": "r2pm",
"args": ["-r", "r2mcp"]
/* セルフビルドの場合で、uv使ってない人はこれ
"command": "/path/to/r2-copilot/start.sh"
/*
/* uvを使ってる場合はこっちの方がパフォーマンス出ると思います
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/r2-copilot",
"r2copilot"
]
*/
}
}一般的なバイナリ解析は、以下のステップで進めることが推奨されます。 なお、gemini-cli等を利用する場合は具体的なコマンドを暗記する必要はなく、自然減での入力が推奨されます。
- セッションの開始
まず、解析対象のファイルに対してradare2セッションを開始します。これにより、以降の操作で参照するセッションIDが発行されます。
コマンド:
create_session(file_path='<ファイルへの絶対パス>')
例:
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='...'))サーバーは、以下のツールを公開しており、それぞれが特定の 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 コマンドを実行します。