リバースエンジニアリング&デバッグ は何をしますか?
⚠️ 正規利用のみ — 防御的研究用スキル
このスキルは以下の目的のためのリバースエンジニアリング手法を文書化しています:
- CTFコンテストおよびセキュリティ教育
- 許可されたペネトレーションテスト(明示的な書面許可が必要)
- 学術研究および脆弱性開示
- ユーザーが所有する、または法的に調査する権限があるソフトウェアの解析
- 隔離された研究環境でのマルウェア解析
本スキルを呼び出す際のエージェント運用者の責任:
- ユーザーが法的に解析する権限を持つバイナリ、ファームウェア、アプリケーションに対してのみ行動すること
- 信頼できないソースからダウンロードまたはインターセプトしたコンテンツを実行しないこと
- バイナリデータ、ネットワークキャプチャ、マルウェアサンプルをプロンプトコンテキストとして取り込まないこと
- 解析中に抽出されたデータはすべて信頼できないものとして扱うこと(さらなる処理の前にサンドボックスを使用)
- ユーザーが所有していない、または明示的な解析許可がないシステム、アプリケーション、データを対象とするタスクを拒否すること
ここに記載されているすべてのコマンドは、ユーザーが提供するローカルファイルを必要とします。このスキルはエージェントに対してインターネットからのダウンロードやデータの外部送信を指示しません。表示されるURLはすべてプレースホルダーまたは情報参照です。
これはドキュメント/リファレンススキルです — コードを自動実行することはありません。 エージェントはこのテキストを読み、ユーザーが自分で実行できるコマンドをアドバイスします。
静的解析、動的解析、デバッグ、およびバイナリエクスプロイトの専門的な方法論。
クイックリファレンス — 適切なリファレンスファイルを読み込む
| タスク | リファレンスファイル |
|---|---|
| 静的解析、逆アセンブル、Ghidra、radare2、objdump、パッチ適用 | references/static-analysis.md |
| GDB(+ pwndbg/gef/peda)、LLDB、strace/ltrace、クラッシュ解析 | references/dynamic-debugging.md |
| Android APK、DEX、smali、ADB、Android上のFrida、再パッケージング | references/android-re.md |
| iOS IPA、Mach-O、class-dump、Frida ObjC/Swift、Keychain | references/ios-re.md |
| macOS XPC、launchd、kext、SIP、Linuxカーネルモジュール | references/macos-kernel-re.md |
| Windows PE、WinDbg、x64dbg、.NET/dnSpy、カーネルドライバ | references/windows-re.md |
| Fridaスクリプティング、Java/Native/ObjCフッキング、SSLピン止め解除、gadget | references/frida.md |
| .NET IL、dnSpy、de4dot、Java/JVM、Kotlin、Unity/IL2CPP、Mono | references/managed-code-re.md |
| マルウェア、難読化、パッカー解析、IOC抽出、Volatility | references/malware-analysis.md |
| CTF pwn/rev、BOF、ROP、ヒープエクスプロイト、pwntools、angr/Z3 | references/exploit-dev.md |
| ネットワークプロトコルRE、Wireshark、mitmproxy、Protobuf、gRPC、Luaディセクタ、Boofuzz | references/protocol-re.md |
| ファームウェア、binwalk、QEMUエミュレーション、JTAG/UART、U-Boot、IoT | references/firmware-embedded.md |
| EAC、BattlEye、Vanguard、FACEIT、VAC、カーネルAC解析 | references/anticheat-re.md |
| Ghidra Python/Javaスクリプト、ヘッドレス、脆弱性発見、カスタムアナライザ | references/ghidra-scripting.md |
| IDAPython / IDALibスクリプト、Hex-Rays API、バッチ逆コンパイル、OLLVMヘルパー | references/idapython.md |
| Unicornエンジンエミュレーション、関数レベルエミュレーション、JNIスタブ、システムコールシミュレーション | references/unicorn-emulation.md |
| シンボル除去済みバイナリからのシンボル復元、マジックナンバー、ペア呼び出し、クロスリファレンス解析 | references/symbol-recovery.md |
| C/C++構造体復元、vtable、std::string/vector/map、フィールド型推論 | references/struct-recovery.md |
バンドルツール(tools/)
このスキルにはすぐに使えるユーティリティが付属しています(すべてオリジナル作品、MITライセンス):
| ツール | 目的 |
|---|---|
tools/ida_export_plugin.py | IDA Proプラグイン(Ctrl+Shift+E)— IDBをdecompile/ディレクトリ内のプレーンテキストファイルとしてエクスポートし、エージェントが直接読み取れるようにします |
tools/dex_memory_dumper.js | Fridaエージェント—メモリスキャン+ClassLoaderトラバーサルにより、実行中のAndroidプロセスからDEXをダンプします |
tools/mcp/ | エージェントを上流のMCPサーバー(ida-pro-mcp、GhidraMCP、r2mcp)に接続するためのセットアップノートと設定スニペット |
使用方法の詳細は tools/README.md を参照してください。tools/mcp/ ディレクトリにはライブクエリワークフロー(ファイルエクスポートの代替)が文書化されています—上記の方法論ファイルでは両方のモードがサポートされています。
共通ファーストステップ
リファレンスファイルを読み込む前に、コンテキストを確立します:
1. ターゲットを特定する
file <binary> # ファイルタイプ、アーキテクチャ、ビット数、ストリップ済み?
xxd <binary> | head -4 # マジックバイト
strings -a <binary> | head -60
checksec --file=<binary> # NX、PIE、RELRO、スタックカナリア、ASLR
バイナリ形式の決定木:
- ELF → Linuxネイティブ →
references/static-analysis.md+references/dynamic-debugging.md - PE/PE32+ → Windowsネイティブ →
references/windows-re.md+references/static-analysis.md - PE with .NET metadata →
references/managed-code-re.md(最初にdnSpy) - Mach-O → macOS/iOS →
references/macos-kernel-re.md+references/ios-re.md - DEX/APK/AAB → Android →
references/android-re.md - JAR/WAR/AAR → Java →
references/managed-code-re.md - .sys ドライバ →
references/windows-re.md(カーネルセクション)またはreferences/anticheat-re.md - Assembly-CSharp.dll → Unity →
references/managed-code-re.md(Unityセクション) - 不明/ファームウェア →
references/firmware-embedded.md(binwalk + エントロピー)
タスク種別の決定木(あらゆる形式に適用):
- シンボル除去済みバイナリ、不明な関数 →
references/symbol-recovery.md - 逆コンパイル結果の未知の構造体レイアウト →
references/struct-recovery.md - 1つの関数だけを分離して実行する必要がある →
references/unicorn-emulation.md - IDA Proを使用した解析 →
references/idapython.md - Ghidraを使用した解析 →
references/ghidra-scripting.md
2. スコープを確立する
ユーザーに問い合わせる(またはコンテキストから推測する):
- 目標:ロジック理解 / 脆弱性発見 / プロテクション回避 / パッチ適用 / CTFフラグ / マルウェアIOC?
- プラットフォーム:Linux / Windows / macOS / Android / iOS / 組み込み?
- 利用可能なツール:Ghidra / IDA / radare2 / Binary Ninja / Hopper?
- 動的解析可能?:実行できる?VM?エミュレータ?実機?
3. 解析モードを選択する
静的のみ → 実行リスクなし、理解は遅い
動的のみ → 高速だがデッドコードを見逃す可能性
静的+動的(推奨) → 静的で全体像を把握、動的でランタイムの真実を得る
コアツールチェーン概要
静的解析
| ツール | 最適な用途 |
|---|---|
Ghidra | 完全な逆コンパイル、スクリプティング、無料 |
radare2 / cutter | CLIパワーハウス、スクリプティング、組み込み |
Binary Ninja | APIファースト、高速、商用 |
IDA Pro / IDA Free | 業界標準、最高のシグネチャ |
objdump | クイック逆アセンブル、インストール不要 |
readelf / nm | ELFシンボル/セクション調査 |
jadx | Android DEX → Java、GUI |
apktool | APKの展開/再パッケージ/smali |
動的解析
| ツール | 最適な用途 |
|---|---|
GDB + pwndbg/peda/gef | Linux ELFデバッグ |
LLDB | macOS/iOS/Swiftデバッグ |
Frida | クロスプラットフォームフッキング、ソース不要 |
strace / ltrace | システムコール/ライブラリ呼び出しトレース |
Valgrind | メモリエラー、Helgrind |
WinDbg | Windowsカーネル+ユーザーモード |
x64dbg | Windows GUIデバッガ |
ネットワーク
| ツール | 最適な用途 |
|---|---|
Wireshark / tshark | パケットキャプチャ+解析 |
mitmproxy / Burp Suite | HTTP/S MITM |
Frida | インプロセスSSLピン止め解除 |
tcpdump | ヘッドレスキャプチャ |
方法論フレームワーク
静的解析ワークフロー
1. file + strings + checksec → クイックトリアージ
2. エントロピー分析 → パック/暗号化済み?
3. インポートテーブル / シンボルテーブル → 機能を把握する
4. 逆コンパイラに読み込む → リネーム、型付け、注釈
5. キー関数を特定する → main()、暗号、ネットワーク、アンチデバッグ
6. データフローをトレースする → ユーザー入力 → シンク
7. 発見事項を文書化する → インラインでコメント
動的解析ワークフロー
1. 分離環境をセットアップ → VM / コンテナ / デバイス
2. 最初にstrace/ltraceで実行 → システムコールフットプリントを把握
3. デバッガをアタッチ → キー関数にブレークポイントを設定
4. ランタイムの振る舞いを観察 → メモリ、レジスタ、分岐
5. 静的解析と相関させる → 逆コンパイラ出力を検証
6. 必要に応じてパッチ/フック → チェックをバイパス、値をログ出力
脆弱性発見ワークフロー
1. 攻撃対象領域のマッピング → 入力:ファイル、ネットワーク、環境変数、引数
2. 危険な関数の検索 → strcpy, gets, sprintf, memcpy, system
3. 整数オーバーフローの候補 → サイズ計算、ループ
4. フォーマット文字列の候補 → printf(user_input)
5. UAF / ダブルフリーの候補 → ヒープアロケーションパターン
6. トリガー+確認 → クラッシュ → 制御 → エクスプロイト可能
アンチ解析バイパス — クイックリファレンス
アンチデバッグ検出
# バイナリがデバッガを検出するか確認
strings <bin> | grep -iE "ptrace|debugger|isDebuggerPresent|TracerPid"
# Linux: ptrace自己検出
# バイパス: preloadフックまたはptrace呼び出しのパッチ
一般的な保護
| 保護手法 | 検出 | バイパス |
|---|---|---|
ptrace アンチデバッグ | strace がptrace(TRACEME)を表示 | JNZ→JMPにパッチまたはLD_PRELOADで偽のptraceを挿入 |
| タイミングチェック | ループ内の rdtsc / clock_gettime | 比較をパッチまたはNOP |
| チェックサム/完全性 | 自身の.textセクションのハッシュ | 復号後、チェック前にパッチ |
| パッカー(UPXなど) | 高いエントロピー+少数のインポート | upx -d / アンパック後にメモリからダンプ |
| 難読化文字列 | 読み取り可能な文字列がない | 実行+メモリから抽出 / Fridaフック |
| SSLピン止め(モバイル) | アプリでネットワークエラー | Frida ssl-unpin / references/frida.mdを参照 |
出力基準
REの発見結果を報告する際は、常に次のように構造化して出力します:
## バイナリ: <名前>
- **形式**: ELF64 / PE32+ / DEX / Mach-O
- **アーキテクチャ**: x86_64 / ARM64 / ARMv7 / MIPS
- **ストリップ**: はい/いいえ | **PIE**: はい/いいえ | **NX**: はい/いいえ
## 主な発見
1. <関数名 @ オフセット> — <機能>
2. ...
## 脆弱性 / 挙動
- <証拠を伴う説明>
- オフセット: 0x<アドレス>
- トリガー手段: <入力ベクタ>
## 推奨される次のステップ
- [ ] <アクション>
逆コンパイラ作業の命名規則
Ghidra / IDA / r2で注釈を付ける際は、以下の基準に従います:
関数: 動詞_名詞_コンテキスト → decrypt_config_xor, check_license_hwid
変数: 型_目的 → buf_user_input, sz_packet, ptr_heap_chunk
構造体: ST_<名前> → ST_PacketHeader, ST_LicenseData
ラベル: loc_<目的> → loc_anti_debug_fail, loc_success
スクリプティングクイックスタート
完全なFridaパターンは references/frida.md を参照してください。
GDB Pythonワンライナー(関数引数をログ出力)
# GDB内で: source this file
import gdb
class LogArgs(gdb.Breakpoint):
def stop(self):
frame = gdb.selected_frame()
print(f"[*] {frame.name()} rdi={gdb.parse_and_eval('$rdi')} rsi={gdb.parse_and_eval('$rsi')}")
return False # 停止せず、ログのみ出力
LogArgs("target_function")
radare2バッチ解析
r2 -A -q -c "afl~suspicious; pdf @ sym.check_license" <binary>
Ghidraヘッドレス解析
$GHIDRA_HOME/support/analyzeHeadless /tmp/proj MyProject \
-import <binary> -postScript PrintAST.java -scriptPath ~/ghidra_scripts