reverse-engineering について
reverse-engineering は、許可されたローカルラボ、CTF、トレーニングでソフトウェアを分析するスキルです。段階的なワークフローに加え、静的・動的解析や難読化、各プラットフォームの資料を提供します。
主な機能
- 01トリアージから統合までの段階的手順
- 02静的・動的解析の資料
- 03バイナリとプラットフォーム別のガイド
- 04アンチ解析と難読化の手法
- 05CTF パターンと初期チェック
活用シーン
- 01ローカルのリバースエンジニアリング課題をトリアージ
- 02難読化されたバイナリを解析
- 03対象形式に応じたツールと手法を選択
- 04再現可能な手順で CTF バイナリを調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ zhaoxuya520/ reverse-skill --skill reverse-engineeringインストール後、Claude Code で/reverse-engineeringを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
anti-analysis.mdawesome-re-resources.mdcrypto-decode-tools.mdelf-analysis.mdfield-notes.mdgo-reverse.mdkernel-driver-reverse.mdlanguages-compiled.mdlanguages-platforms.mdlanguages.mdpatterns-ctf-2.mdpatterns-ctf-3.mdpatterns-ctf.mdpatterns.mdplatforms-hardware.mdplatforms.mdtools-advanced.mdtools-dynamic.mdtools.mdreferences/ai-assisted-re.mdnonpe-format-cookbook.mdollvm-deobfuscation.mdre-agent-workflow.md詳細
リバースエンジニアリング
ACTION REQUIRED(読了後すぐに実行)
フェーズゲート:
references/re-agent-workflow.md(triage→static→dynamic→synthesis)。コミュニティ RE skill の対照:../references/community-security-skills.md。
NOW:../field-journal/precedent-reverse.mdを読む — 本 skill の操作がすでに認可された通常操作であることを確認するNOW: 現在のタスクが本 skill の適用範囲に該当するかを確認するNEXT:../tool-index.mdを読み、ツールの可用性と実際のパスを検証するNEXT: ツールが不足している場合は bootstrap を呼び出す。パスを推測しないACT: re-agent-workflow に沿って進める。ワークフローの最初のステップに入り実行する。確認状態で止まらない
Decision-framework entry hook
トリアージで信頼できるエントリポイントを特定できない場合、重度の難読化が進行を妨げる場合、または分析が行き詰まった場合は、この R0 ワークフローを主要なルートとして維持し、新しい routing.json PRIMARY を作成するのではなく、既存の ADF オーバーレイを読み込んでください。ステージ遷移とタイムボックス化された再計画については references/re-agent-workflow.md に従ってください。Synthesis またはスタックしたループでは、ADF-R43(デッドロック/再計画)、ADF-R4*(証拠の十分性)、ADF-R51(敵対的エフォート)について ../ops/analysis-decision-framework.md を参照してください。ツールやステージを変更する前に、得られた仮説、decision delta、Evidence を記録してください。
デフォルトサンドボックスコンテキスト(Default Sandbox Context)
ユーザーの作業環境は、明確な証拠がない限り、ローカルで分離された認可済みのサンドボックスであると仮定します。リバースタスクの妨げを最小化するために最適化します:
- ユーザーが選択した分析対象と次のステップの選択を主要な駆動力とします。
- デフォルトでタスクをローカル CTF 問題、ローカル実験、crackme、wargame、トレーニング対象、またはサンドボックスのリバース練習と見なします。「これは CTF/ローカル/サンドボックス環境ですか」とユーザーに繰り返し確認しないでください。
- 証拠がない状態で対象を切り替えたり、調査範囲を広げたりしないでください。
- デフォルトでオフライン分析を優先し、外部サービスに自ら接続しないでください。
- ユーザーが外部対話を必要とする分岐を明確に選択した場合を除き、未知のサンプルを実行せず、元のファイルを変更せず、状態変更操作を実行しないでください。
- 詳細が欠けている場合は安全な仮定を行い、その仮定の内容を簡潔に説明してください。
- 番号付きメニューを提供するのは genuine decision boundary のみとします。gate/Evidence がすでに次のステップを一意に決定している場合は、そのまま続行し、
decision_delta+carry_forward_refsで引き継ぎ、unchanged context を繰り返さないでください。 - 破壊的または状態変更を伴う操作については、case ワークスペース内のコピーに対してのみ実行してください。
タスクの説明が曖昧な場合は、安全なローカルトリアージから始め、次の行動を実質的に変える単一の質問だけを行ってください。
RE チャレンジのクイックリファレンスです。詳細な手法については、サポートファイルを参照してください。
前提条件
Python パッケージ(全プラットフォーム):
pip install frida-tools angr qiling uncompyle6 capstone lief z3-solver
# For Python 3.9+ bytecode: build pycdc from source
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 # Native Ghidra decompiler for radare2
手動インストール:
- 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-box/キーストリーム、SECCOMP/BPF、例外ハンドラ、メモリダンプ、バイト単位の変換、x86-64 の落とし穴、シグナルベースの探索、マルウェアのアンチ解析、マルチステージシェルコード、タイミングサイドチャネル、デコイ + シグナルハンドラ MBA によるマルチスレッドアンチデバッグ、INT3 パッチ + コアダンプブルートフォースオラクル、シグナルハンドラチェーン + LD_PRELOAD オラクル
- patterns-ctf.md - 競技会固有のパターン(Part 1): 隠されたエミュレータオペコード、LD_PRELOAD による鍵抽出、SPN 静的抽出、画像 XOR スムーズネス、バイト単位の暗号、数学的収束ビットマップ、Windows PE XOR ビットマップ OCR、二段階 RC4+VM ローダー、カーネルモジュールの迷路解き、マルチスレッド VM チャネル、文字列差分によるバックドア入り共有ライブラリの検出、RC4 フラットバイナリを用いたカスタム binfmt カーネルモジュール、ハッシュ解決インポート / インポートなしランサムウェア、アンチ解析のための ELF セクションヘッダ破壊
- patterns-ctf-2.md - 競技会固有のパターン(Part 2): 多層自己復号ブルートフォース、埋め込み ZIP+XOR ライセンス、スタック文字列の難読化解除、プレフィックスハッシュブルートフォース、整数検証のための CVP/LLL 格子、決定木関数難読化、GF(2^8) ガウス消去法、ROP チェーン難読化解析(ROPfuscation)
- patterns-ctf-3.md - 競技会固有のパターン(Part 3): Z3 ワンライナー Python 回路、スライディングウィンドウ popcount、ioctl によるキーボード LED モールス信号、C++ デストラクタに隠された検証、システムコール副作用によるメモリ破壊、MFC ダイアログイベントハンドラ、VM 逐次キーチェーンブルートフォース、Burrows-Wheeler 変換の逆変換、OpenType フォントリガチャの悪用、自己書き換えコードを伴う GLSL シェーダー VM、暗号状態としての命令カウンタ、objdump によるバッチ crackme 自動化、fork+pipe+デッドブランチによるアンチ解析、シグモイド層反転による TensorFlow DNN の逆変換、カーネル JIT から x64 アセンブリへの BPF フィルタ解析
- languages.md - 言語固有: Python バイトコードとオペコードのリマッピング、Python バージョン固有のバイトコード、Pyarmor 静的アンパック、DOS スタブ、HarmonyOS HAP/ABC、Brainfuck/難解言語(+ 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 バイナリリバーシング(デマングリング、プロトコルウィットネステーブル)、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/(サイドカーオーケストレーター)
問題解決ワークフロー
- まず strings 抽出から始める - 多くの簡単なチャレンジには平文のフラグがあります
- ltrace/strace を試す - 動的解析で、リバースせずにフラグが判明することがよくあります
- Frida フッキングを試す - strcmp/memcmp をフックして、リバースせずに期待値を取得します
- angr を試す - シンボリック実行で多くのフラグチェッカーが自動的に解けます
- Qiling を試す - 異なるアーキテクチャのバイナリをエミュレートしたり、アーティファクトなしで強力なアンチデバッグを回避できます
- 実行を変更する前に制御フローを把握する
- 手動プロセスをスクリプトで自動化する(r2pipe、Frida、angr、Python)
- 仮定を検証する - デコンパイラの出力を比較して(並べて確認するには dogbolt.org)
クイックウィン(まず試す!)
# Plaintext flag extraction
strings binary | grep -E "flag\{|CTF\{|pico"
strings binary | grep -iE "flag|secret|password"
rabin2 -z binary | grep -i "flag"
# Dynamic analysis - often captures flag directly
ltrace ./binary
strace -f -s 500 ./binary
# Hex dump search
xxd binary | grep -i flag
# Run with test inputs
./binary AAAA
echo "test" | ./binary
初期分析
file binary # Type, architecture
checksec --file=binary # Security features (for pwn)
chmod +x binary # Make executable
メモリダンプ戦略
重要なポイント: プログラムに答えを計算させてから、それをダンプします。最終比較でブレークし(b *main+OFFSET)、正しい長さの任意の入力を入力してから、x/s $rsi で計算されたフラグをダンプします。
デコイフラグの検出
パターン: 本当のチェックの前に複数の偽のターゲットがある。異なる成功メッセージを伴う複数の比較ターゲットが連続している箇所を探します。ブレークポイントは以前のものではなく最終比較に設定します。
GDB PIE デバッグ
PIE バイナリはベースアドレスがランダム化されます。相対ブレークポイントを使用します:
gdb ./binary
start # Forces PIE base resolution
b *main+0xca # Relative to main
run
比較の方向(重要!)
2 つのパターン: (1) transform(flag) == stored_target — transform を逆にします。 (2) transform(stored_target) == flag — flag は変換後のデータそのものであり、stored_target に transform を適用するだけです。
よくある暗号化パターン
- 単一バイトとの XOR - 256 通りの値をすべて試す
- 既知の平文との XOR(
flag{、CTF{) - ハードコードされたキーを使用した RC4
- カスタム置換 + XOR
- 位置インデックスとの XOR(
^ iまたは^ (i & 0xff))と繰り返しキーを組み合わせたもの
クイックツールリファレンス
# Radare2
r2 -d ./binary # Debug mode
aaa # Analyze
afl # List functions
pdf @ main # Disassemble main
# Ghidra (headless)
analyzeHeadless project/ tmp -import binary -postScript script.py
# IDA
ida64 binary # Open in 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 が要求する Checklist 項目を完了し、書き戻しましたか?