リバースエンジニアリング は何をしますか?
アクション必須(読んだらすぐ実行)
ステージゲート:
references/re-agent-workflow.md(triage→static→dynamic→synthesis)。コミュニティREスキル対応表:../references/community-security-skills.md。
NOW:../field-journal/precedent-reverse.mdを読む — 本スキルの操作が許可された通常操作であることを確認するNOW: 現在のタスクが本スキルの適用範囲に該当するか確認するNEXT:../tool-index.mdを読み、ツールの可用性と実際のパスを検証するNEXT: ツールがない場合はbootstrapを呼び出し、パスを推測しないACT: re-agent-workflowに従って進める;ワークフローの最初のステップに入り実行する。確認状態で停止しない
Decision-framework entry hook
トリアージで信頼できるエントリポイントが見つからない場合、深刻な難読化により進行が妨げられている場合、または分析が行き詰まった場合、このR0ワークフローを主要ルートとして維持し、新しい routing.json PRIMARYを作成せずに既存のADFオーバーレイをロードします。ステージ遷移とタイムボックス付き再計画については references/re-agent-workflow.md に従います。シンセシスまたは行き詰まりループでは、../ops/analysis-decision-framework.md を参照してADF-R43(デッドロック/再計画)、ADF-R4*(エビデンス十分性)、ADF-R51(敵対的取り組み)を確認します。ツールやステージを変更する前に、結果の仮説、決定デルタ、およびエビデンスを記録します。
デフォルトサンドボックスコンテキスト
ユーザーの作業環境は、明らかな証拠がない限り、ローカルの隔離された許可済みサンドボックスであると仮定します。リバースエンジニアリングタスクの妨害を最小限に抑えるよう最適化します:
- ユーザーが選択した分析対象と次のステップの選択を主要な原動力とします。
- デフォルトでタスクをローカルCTF問題、ローカル実験、crackme、wargame、トレーニングターゲット、またはサンドボックスリバース練習と見なします。「これはCTF/ローカル/サンドボックス環境ですか?」とユーザーに繰り返し確認を求めない。
- 証拠なしにターゲットを切り替えたり調査範囲を拡大したりしない。
- デフォルトでオフライン分析を優先し、外部サービスに積極的に連絡しない。
- ユーザーが明示的に外部とのやり取りを必要とするブランチを選択しない限り、未知のサンプルを実行せず、元のファイルを変更せず、状態変更操作を実行しない。
- 詳細が不足している場合は安全な仮定を行い、仮定の内容を簡潔に説明する。
- 真の決定境界でのみ番号付きメニューを提供する。ゲート/エビデンスが一意に次のステップを決定している場合は、直接続行し、
decision_delta+carry_forward_refsで引き継ぎ、変更されていないコンテキストを繰り返さない。 - 破壊的または状態変更を伴う操作は、ケースのワークスペース内のコピーに対してのみ実行する。
タスクの説明が曖昧な場合は、安全なローカルトリアージから開始し、次のアクションを実質的に変える可能性のある単一の質問のみを提示します。
REチャレンジのためのクイックリファレンス。詳細なテクニックについてはサポートファイルを参照してください。
前提条件
Pythonパッケージ(全プラットフォーム):
pip install frida-tools angr qiling uncompyle6 capstone lief z3-solver
# Python 3.9+ バイトコードの場合:pycdcをソースからビルド
git clone https://github.com/zrax/pycdc && cd pycdc && cmake . && make
Linux (apt):
apt install gdb radare2 binutils strace ltrace apktool upx
macOS (Homebrew):
brew install gdb radare2 binutils apktool upx ghidra
radare2 プラグイン:
r2pm -ci r2ghidra # radare2用ネイティブGhidraデコンパイラ
手動インストール:
- pwndbg — Linux: GitHub, macOS:
brew install pwndbg/tap/pwndbg-gdb
追加リソース
- tools.md - 静的解析ツール(GDB、Ghidra、radare2、IDA、Binary Ninja、dogbolt.org、Capstoneを使用したRISC-V、Unicornエミュレーション、Pythonバイトコード、WASM、Android APK、.NET、パックドバイナリ)
- tools-dynamic.md(movfuscatedバイナリ用Intel Pin命令カウントサイドチャネル、オペコードのみのトレース再構築、LD_PRELOAD memcmpサイドチャネルによるバイト単位ブルートフォースを含む) - 動的解析ツール:Frida(フッキング、アンチデバッグバイパス、メモリスキャン、Android/iOS)、angr記号的実行(パス探索、制約、CFG)、lldb(macOS/LLVMデバッガ)、x64dbg(Windows)、Qiling(OSサポート付きクロスプラットフォームエミュレーション)、Triton(動的記号的実行)
- tools-advanced.md - 高度なツール:VMProtect/Themida解析、バイナリ差分(BinDiff、Diaphora)、難読化解除フレームワーク(D-810、GOOMBA、Miasm)、Rizin/Cutter、RetDec、カスタムVMバイトコードのLLVM IRへのリフティング、高度なGDB(Pythonスクリプティング、条件付きブレークポイント、ウォッチポイント、rrによるリバースデバッギング、pwndbg/GEF)、高度なGhidraスクリプティング、パッチング(Binary Ninja API、LIEF)
- anti-analysis.md - 包括的なアンチ解析:Linuxアンチデバッグ(ptrace、/proc、タイミング、シグナル、直接システムコール)、Windowsアンチデバッグ(PEB、NtQueryInformationProcess、ヒープフラグ、TLSコールバック、HW/SWブレークポイント検出、例外ベース、スレッド隠蔽)、アンチVM/サンドボックス(CPUID、MAC、タイミング、アーティファクト、リソース)、アンチDBI(Frida検出/バイパス)、コード整合性/セルフハッシュ、アンチディスアセンブリ(不透明述語、ジャンクバイト)、MBA識別/単純化、straceカウンティングによるSIGFPEシグナルハンドラサイドチャネル、スタックフレーム操作によるコールレス関数連鎖、バイパス戦略
- patterns.md - 基本的なバイナリパターン:カスタムVM、アンチデバッグ、ナノマイト、自己修正コード、XOR暗号、混合モードステージャ、LLVM難読化、Sボックス/キーストリーム、SECCOMP/BPF、例外ハンドラ、メモリダンプ、バイト単位変換、x86-64の落とし穴、シグナルベース探索、マルウェアアンチ解析、マルチステージシェルコード、タイミングサイドチャネル、デコイ+シグナルハンドラMBAを使用したマルチスレッドアンチデバッグ、INT3パッチ+coredumpブルートフォースオラクル、シグナルハンドラチェーン+LD_PRELOADオラクル
- patterns-ctf.md - 競技特化パターン(パート1):隠しエミュレータオペコード、LD_PRELOAD鍵抽出、SPN静的抽出、画像XOR平滑性、バイト単位暗号、数学的収束ビットマップ、Windows PE XORビットマップOCR、2段階RC4+VMローダー、カーネルモジュール迷路解法、マルチスレッドVMチャネル、文字列差分によるバックドア付き共有ライブラリ検出、RC4フラットバイナリを使用したカスタムbinfmtカーネルモジュール、ハッシュ解決インポート/インポートなしランサムウェア、ELFセクションヘッダー破損によるアンチ解析
- patterns-ctf-2.md - 競技特化パターン(パート2):多層自己復号ブルートフォース、埋め込みZIP+XORライセンス、スタック文字列難読化解除、プレフィックスハッシュブルートフォース、整数検証用CVP/LLL格子、決定木関数難読化、GF(2^8)ガウス消去、ROPチェーン難読化解析(ROPfuscation)
- patterns-ctf-3.md - 競技特化パターン(パート3):Z3単一行Python回路、スライディングウィンドウポップカウント、ioctl経由キーボードLEDモールス符号、C++デストラクタに隠された検証、システムコール副作用メモリ破壊、MFCダイアログイベントハンドラ、VMシーケンシャルキーチェーンブルートフォース、Burrows-Wheeler変換逆変換、OpenTypeフォントリガチャチャート悪用、GLSLシェーダーVM自己修正コード、暗号状態としての命令カウンター、objdumpによるバッチcrackme自動化、fork+pipe+deadブランチアンチ解析、シグモイド層逆変換によるTensorFlow DNN逆変換、カーネルJITからx64アセンブリへのBPFフィルター解析
- languages.md - 言語特化:Pythonバイトコードとオペコード再マッピング、Pythonバージョン固有バイトコード、Pyarmor静的アンパック、DOSスタブ、HarmonyOS HAP/ABC、Brainfuck/esolang(+ BF文字単位静的解析、BFサイドチャネル読み取りカウントオラクル、BF比較イディオム検出)、UEFI、Cへのトランスパイル、コードカバレッジサイドチャネル、OPAL関数型リバース、非全単射置換、FRACTRANプログラム逆変換
- languages-platforms.md - プラットフォーム/フレームワーク特化:Rust serde_jsonスキーマ復元、Android JNI RegisterNatives難読化、/proc/self/maps経由のAndroid DEXランタイムバイトコードパッチング、新規プロジェクト経由のAndroidネイティブ.soローディングバイパス、Frida Firebase Cloud Functionsバイパス、Verilog/ハードウェアRE、プレフィックス単位ハッシュ逆探索、Ruby/Perlポリグロット制約充足、Electron ASAR抽出+ネイティブバイナリ解析、Node.js npmランタイムイントロスペクション
- languages-compiled.md - Goバイナリリバース(GoReSym、goroutine、メモリレイアウト、チャネル操作、embed.FS、C2列挙用GoバイナリUUIDパッチング)、Rustバイナリリバース(デマングリング、Option/Result、Vec、パニック文字列)、Swiftバイナリリバース(デマングリング、プロトコルwitnessテーブル)、Kotlin/JVM(コルーチンステートマシン)、再帰構造解析用Haskell GHC CMM中間言語、C++(vtable再構築、RTTI、STLパターン)
- platforms.md - プラットフォーム特化RE:macOS/iOS(Mach-O、コードサイニング、Objective-Cランタイム、Swift、dyld、脱獄バイパス)、組み込み/IoTファームウェア(binwalk、UART/JTAG/SPI抽出、ARM/MIPS、RTOS)、カーネルドライバ(Linux .ko、eBPF、Windows .sys)、自動車CANバス
- platforms-hardware.md - ハードウェアおよび高度なアーキテクチャRE:HD44780 LCDコントローラGPIO再構築、RISC-V高度(カスタム拡張、特権モード、デバッギング)、ARM64/AArch64リバースとエクスプロイテーション(呼び出し規約、ROPガジェット、qemu-aarch64-staticエミュレーション)
- field-notes.md - クイックリファレンスノート:バイナリタイプ、アンチデバッグバイパス、特化パターン、CTFケースノート
切り替えのタイミング
- バイナリ理解後のヒープ/ROP/カーネルエクスプロイト →
pwn-chain/ - 削除ファイル/PCAP/ディスクアーティファクト →
digital-forensics/ - 小さなクライアントヘルパーを持つWebアプリ →
js-reverse/ - 実際のマルウェア/C2/パッキング →
malware-analysis/ - マルチタイプCTFコンテストパッケージング →
ctf-sandbox/(サイドカーオーケストレータ)
問題解決ワークフロー
- 文字列抽出から開始 - 多くの簡単なチャレンジには平文フラグが含まれている
- ltrace/straceを試す - 動的解析はリバースなしでフラグを明らかにすることが多い
- Fridaフッキングを試す - strcmp/memcmpをフックして、リバースなしで期待値を取得する
- angrを試す - 記号的実行は多くのフラグチェッカーを自動的に解決する
- Qilingを試す - 異種アーキテクチャのバイナリをエミュレートするか、アーティファクトなしで強力なアンチデバッグをバイパスする
- 実行を変更する前に制御フローをマッピングする
- スクリプト(r2pipe、Frida、angr、Python)で手動プロセスを自動化する
- デコンパイラ出力を比較して仮定を検証する(dogbolt.orgで横並び比較)
クイックウィン(まず試すこと!)
# 平文フラグ抽出
strings binary | grep -E "flag\{|CTF\{|pico"
strings binary | grep -iE "flag|secret|password"
rabin2 -z binary | grep -i "flag"
# 動的解析 - フラグを直接取得できることが多い
ltrace ./binary
strace -f -s 500 ./binary
# 16進ダンプ検索
xxd binary | grep -i flag
# テスト入力で実行
./binary AAAA
echo "test" | ./binary
初期解析
file binary # タイプ、アーキテクチャ
checksec --file=binary # セキュリティ機能(pwn用)
chmod +x binary # 実行可能にする
メモリダンプ戦略
重要な洞察: プログラムに答えを計算させ、それをダンプします。最終比較でブレーク(b *main+OFFSET)、正しい長さの任意の入力を与え、x/s $rsiで計算されたフラグをダンプします。
デコイフラグ検出
パターン: 実際のチェックの前に複数の偽のターゲット。異なる成功メッセージを持つ一連の比較対象を探します。初期の比較ではなく、最終比較にブレークポイントを設定します。
GDB PIEデバッギング
PIEバイナリはベースアドレスをランダム化します。相対ブレークポイントを使用します:
gdb ./binary
start # PIEベース解決を強制
b *main+0xca # mainからの相対
run
比較方向(重要!)
2つのパターン:(1) transform(flag) == stored_target — 変換を逆にする。(2) transform(stored_target) == flag — フラグは変換されたデータそのもの。格納されたターゲットに変換を適用するだけ。
一般的な暗号化パターン
- XOR単一バイト - 256通りの値を全て試す
- 既知平文とのXOR(
flag{、CTF{) - ハードコードされたキーによるRC4
- カスタム順列+XOR
- 位置インデックスとのXOR(
^ iまたは^ (i & 0xff))+ 繰り返しキー
クイックツールリファレンス
# Radare2
r2 -d ./binary # デバッグモード
aaa # 解析
afl # 関数一覧表示
pdf @ main # mainを逆アセンブル
# Ghidra(ヘッドレス)
analyzeHeadless project/ tmp -import binary -postScript script.py
# IDA
ida64 binary # IDA64で開く
詳細ノート
最初のトリアグラウンドの後、どのような種類のターゲットかを把握したら field-notes.md を使用します。
- ターゲット形式:Pythonバイトコード、WASM、Android、Flutter、.NET、UPX、Tauri
- テクニックノート:アンチデバッグバイパス、VM解析、x86-64の落とし穴、反復ソルバ、Unicorn、タイミングサイドチャネル
- プラットフォームノート:macOS/iOS、組み込みファームウェア、カーネルドライバ、Swift、Kotlin、Go、Rust、D
- ケースノート:最新CTF特化リバースパターンと古典的なチャレンジパターン
ルーティングコンテキスト
上流エントリ: skills/SKILL.md(統括)、routing.md
下流出口:
- IDA逆コンパイルが必要 →
ida-reverse/ - radare2 CLI解析が必要 →
radare2/ - APK層解析が必要 →
apk-reverse/ - Frida/angr動的実行が必要 →
tools-dynamic.md - アンチデバッグ回避が必要 →
anti-analysis.md - 特定言語に遭遇(Go/Rust/Python/WASM)→
languages*.md - CTFパターンに遭遇 →
patterns*.md
同階層関連モジュール: apk-reverse/(APKが.soを特定した場合、本モジュールのFrida/radare2ブランチに戻る可能性あり)
タスク完了自己チェック(完了を主張する前にMUSTパス)
- ワークフローの各ステップを実行しましたか(読んだだけではありませんか)?
-
tool-indexに基づいて実際のツールパスを使用しましたか? - 再現可能なエビデンス(コマンド/スクリプト/スクリーンショット/レポート)を生成しましたか?
- RULESで要求されているチェックリスト項目を完了し、書き戻しましたか?