mcpField
C
ctf-reverse

ctf-reverse

github.com/ljagielloセキュリティ3.6k10.3k 回インストール2 日前に更新
リポジトリ

ctf-reverse について

CTF のバイナリ解析に取り組む分析者向けのリバースエンジニアリングスキルです。初動の手順に加え、ツール、プラットフォーム、エミュレーション、問題パターンの詳細なノートを提供します。

主な機能

  1. 01静的・動的解析の手引き
  2. 02エミュレーションとシンボリック実行の技法
  3. 03プラットフォーム・言語別ノート
  4. 04CTF 問題パターンのリファレンス
  5. 05MCP サーバーの設定ガイド

活用シーン

  1. 01未知の問題バイナリの初期調査
  2. 02対象プラットフォームに合うツールの選定
  3. 03アンチデバッグや独自 VM の調査

MCP 対応

Agent によるリバースエンジニアリング向けに、IDA Pro MCP、Ghidra MCP、JADX MCP の任意の連携を説明し、GUI 不要の解析方法も扱います。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ljagiello/ctf-skills --skill ctf-reverse

インストール後、Claude Code で/ctf-reverseを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

anti-analysis-ctf.md
anti-analysis.md
field-notes.md
languages-compiled.md
languages-platforms.md
languages.md
mba-simplification.md
patterns-ctf-2.md
patterns-ctf-3.md
patterns-ctf.md
patterns-runtime.md
patterns.md
platforms-hardware.md
platforms.md
radare2-r2pipe.md
tools-advanced-2.md
tools-advanced.md
tools-dynamic.md
tools-emulation.md
tools-mcp.md
tools.md
unicorn-emulation.md

詳細

CTF リバースエンジニアリング

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
# The prebuilt r2ghidra zip is ABI-locked to one radare2 version (WARN: ABI mismatch: Expect 142 vs 152); r2pm -ci r2ghidra builds the plugin from source instead.

手動インストール:

  • pwndbg — Linux:GitHub、macOS:brew install pwndbg/tap/pwndbg-gdb

MCP サーバー(オプション、エージェント主導の RE): IDA Pro MCP (mrexodia/ida-pro-mcp)、Ghidra MCP (bethington/ghidra-mcp — ヘッドレスサーバーがあるため、GUI は不要です)、JADX MCP (zinja-coder/jadx-ai-mcp) — セットアップと使用方法については、tools-mcp.md を参照してください。

追加リソース

  • unicorn-emulation.md - Unicorn CPU エミュレーション:生のバイナリアセンブリのエミュレーション、フック、ARM/MIPS/Thumb、混合モード、ファームウェアの MMIO、Keystone+Capstone によるトレース逆変換、シェルコードのアンパック、カスタム VM、Qiling との使い分けの判断(フル機能の GDB/angr を使うより、unicorn + バイナリ + アセンブリだけでリバースエンジニアリングするほうが簡単な場合があります)
  • tools.md - 静的解析ツール(GDB、Ghidra、radare2、IDA、Binary Ninja、dogbolt.org、Capstone による RISC-V、Unicorn エミュレーション、Python バイトコード、WASM、Android APK、.NET、パック済みバイナリ)
  • radare2-r2pipe.md - radare2 スクリプティングの詳細(対話型シェルを使わないバッチモード、バッチモードでの wx によるバイトパッチ、プラグイン ABI の整合性確認を伴う pdg/pdgj による r2ghidra のデコンパイル、aei/aeim/aesu による ESIL の単一関数エミュレーション、r2pipe セッションのライフサイクルと cmdj の JSON に関する落とし穴、xref と aflj を使ったマッピングチェッカー)
  • tools-mcp.md - MCP サーバー統合(エージェント駆動の RE):IDA Pro MCP(GUI プラグイン + idalib ヘッドレス)、Ghidra MCP(ヘッドレスサーバー、GUI 不要)、JADX MCP(Android APK/DEX)。さらに、逆コンパイルする代わりに、ホスト上で Android の .so を dlopen して JNI 境界を越える方法
  • tools-dynamic.md - 動的解析ツール:Frida(フック、アンチデバッグ回避、メモリスキャン、Android/iOS)、angr シンボリック実行(パス探索、制約、CFG)、lldb(macOS/LLVM デバッガー)、x64dbg(Windows)
  • tools-emulation.md - エミュレーションフレームワークとサイドチャネルツール:Qiling(クロスプラットフォームの OS レベルエミュレーション)、Triton(DSE)、Intel Pin による命令数カウント + 遺伝的アルゴリズムのサイドチャネル、オペコードのみのトレース再構築、LD_PRELOAD による時間の固定と memcmp サイドチャネルを使った 1 バイトずつの総当たり
  • tools-advanced.md - 高度なツール(パート 1):VMProtect/Themida の解析、バイナリ差分解析(BinDiff、Diaphora)、難読化解除フレームワーク(D-810、GOOMBA、Miasm)、Qiling フレームワーク、Triton DSE、Manticore、Rizin/Cutter、RetDec、カスタム VM バイトコードの LLVM IR へのリフティング
  • tools-advanced-2.md - 高度なツール(パート 2):高度な GDB(Python スクリプティング、総当たり、条件付きブレークポイント、ウォッチポイント、rr によるリバースデバッグ、pwndbg/GEF)、高度な Ghidra スクリプティング、パッチ適用(Binary Ninja API、LIEF)、GDB による制約抽出 + ILP ソルバー(BackdoorCTF 2017)、GDB による位置エンコード入力のゼロフラグ監視(EKOPARTY 2017)、LD_PRELOAD による実行専用バイナリのダンプ(BackdoorCTF 2017)、PEDA の current_inst によるフラグのビット単位スクレイピング(CONFidence CTF 2019 Teaser)
  • mba-simplification.md - msynth による MBA の簡略化:オラクルを利用する Simplifier とゼロから探索する Synthesizer の比較、ランダム入力による同値性チェックの必須実施、Miasm との統合
  • anti-analysis.md - アンチ解析の分類:Linux のアンチデバッグ(ptrace、/proc、タイミング、シグナル、直接システムコール)、Windows のアンチデバッグ(PEB、NtQueryInformationProcess、ヒープフラグ、TLS コールバック、HW/SW ブレークポイント検出、例外ベース、スレッド隠蔽)、アンチ VM/サンドボックス(CPUID、MAC、タイミング、痕跡、リソース)、アンチ DBI(Frida の検出/回避)、コード整合性/セルフハッシュ、アンチ逆アセンブル(不透明述語、ジャンクバイト)、MBA の識別/簡略化、包括的な回避戦略
  • anti-analysis-ctf.md - CTF の writeup で使われる手法:実行モード切り替えのための SIGILL ハンドラー(Hack.lu 2015)、strace のカウントを介した SIGFPE シグナルハンドラーのサイドチャネル(PlaidCTF 2017)、Keystone と Unicorn による命令トレースの逆変換(MeePwn 2017)、スタックフレーム操作による call-less 関数チェーン(THC 2018)、process_vm_writev による親プロセスのパッチ適用済み子バイナリのダンプ(Google CTF Quals 2018)
  • patterns.md - 基本的なバイナリパターン:カスタム VM、アンチデバッグ、ナノマイト、自己書き換えコード、XOR 暗号、混合モードのステージャー、LLVM 難読化、S-box/キーストリーム、SECCOMP/BPF、例外ハンドラー、メモリダンプ、バイト単位の変換、x86-64 の注意点、カスタム mangling の逆変換、位置ベースの変換、16 進エンコードされた文字列比較、シグナルベースのバイナリ探索
  • patterns-runtime.md - ランタイムパッチとオラクルの手法:マルウェアのアンチ解析回避、マルチステージのシェルコードローダー、タイミングサイドチャネル攻撃、デコイ + シグナルハンドラー MBA を使ったマルチスレッドのアンチデバッグ(ApoorvCTF 2026)、INT3 パッチ + コアダンプの総当たりオラクル(Pwn2Win 2016)、シグナルハンドラーチェーン + LD_PRELOAD オラクル(Nuit du Hack 2016)、printf フォーマット文字列 VM の Z3 へのデコンパイル(SECCON 2017)、クアッドツリー再帰画像フォーマットパーサー(Google CTF Quals 2018)
  • patterns-ctf.md - 競技固有のパターン(パート 1):隠されたエミュレーターのオペコード、LD_PRELOAD によるキー抽出、SPN の静的抽出、画像 XOR の滑らかさ、1 バイトずつの暗号、数学的収束ビットマップ、Windows PE XOR ビットマップ OCR、2 段階 RC4+VM ローダー、GBA ROM のミートインザミドル、Sprague-Grundy ゲーム理論、カーネルモジュールの迷路解法、マルチスレッド 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 回路、スライディングウィンドウの 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 スタブ、Unity IL2CPP、HarmonyOS HAP/ABC、Brainfuck/難解プログラミング言語(BF の文字単位の静的解析、BF のサイドチャネル読み取り回数オラクル、BF 比較イディオムの検出を含む)、UEFI、C へのトランスパイル、コードカバレッジのサイドチャネル、OPAL 関数型リバースエンジニアリング、非全単射置換、FRACTRAN プログラムの逆変換
  • languages-platforms.md - プラットフォーム/フレームワーク固有の内容:Roblox place ファイル解析、Godot ゲームアセット抽出、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、ゴルーチン、メモリレイアウト、チャネル操作、embed.FS、C2 列挙のための Go バイナリ UUID パッチ)、Rust バイナリのリバースエンジニアリング(名前のデマングリング、Option/Result、Vec、panic 文字列)、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)、ゲームエンジン(Unreal Engine、Unity、アンチチート、Lua)、車載 CAN バス
  • platforms-hardware.md - ハードウェアおよび高度なアーキテクチャの RE:HD44780 LCD コントローラーの GPIO 再構築、高度な RISC-V(カスタム拡張、特権モード、デバッグ)、ARM64/AArch64 のリバースエンジニアリングとエクスプロイト(呼び出し規約、ROP ガジェット、qemu-aarch64-static エミュレーション)
  • field-notes.md - クイックリファレンスノート:バイナリの種類、アンチデバッグ回避、特殊なパターン、CTF ケースノート

切り替えのタイミング

  • バイナリをすでに理解しており、ヒープ、ROP、またはカーネルのエクスプロイトが必要な場合は、/ctf-pwn に切り替えてください。
  • 課題が削除済みファイル、PCAP データ、またはディスク上の痕跡の復元に関するものであれば、/ctf-forensics に切り替えてください。
  • 対象がウェブアプリで、小規模なクライアント側ヘルパースクリプトだけをリバースエンジニアリングしている場合は、/ctf-web に切り替えてください。
  • バイナリが機械学習モデルを実装しており、課題がモデルへの攻撃や敵対的入力に関するものであれば、/ctf-ai-ml に切り替えてください。
  • リバースエンジニアリングしたバイナリの中核ロジックが暗号アルゴリズムまたは数学の問題であれば、/ctf-crypto に切り替えてください。
  • バイナリがC2、パッキング、または回避動作を備えた実際のマルウェアサンプルであれば、/ctf-malware に切り替えてください。
  • 課題が実際のバイナリではなく、簡易VM、エンコーディングパズル、またはpyjailであれば、/ctf-misc に切り替えてください。

問題解決ワークフロー

  1. まず文字列を抽出する - 簡単な課題の多くには平文のフラグがあります
  2. ltrace/straceを試す - 動的解析で、リバースエンジニアリングせずにフラグが判明することがよくあります
  3. Fridaフックを試す - strcmp/memcmpをフックし、リバースエンジニアリングせずに期待値を取得します
  4. angrを試す - シンボリック実行により、多くのフラグチェッカーを自動的に解けます
  5. Qilingを試す - 他アーキテクチャのバイナリをエミュレートするか、痕跡を残さずに強力なアンチデバッグを回避します
  6. 実行を変更する前に制御フローをマッピングする
  7. スクリプト(r2pipe、Frida、angr、Python)で手作業を自動化する
  8. デコンパイラの出力を比較して仮説を検証する(並べて比較するには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

厳守事項 — トリアージの出力を決して切り詰めないでください。以下を必ずそのまま守ってください。独自の判断で変更してはいけません。

  1. トリアージの出力をheadにパイプしてはいけません(またはsed -n 'N,Mp'で上限を設けてはいけません)。 自分の出力を切り詰めるのは、MCPのページネーションが黙って行われるのと同じ不具合であり、 同じ結果を招きます。フラグが含まれていない表示を見て「ここにフラグはない」と結論づけてしまいます。出力を制限するのではなく、シグナルをgrepしてください。

    strings binary | grep -inE "flag|ctf\{|congrat|correct|wrong"   # filter, don't truncate
    objdump -d --disassemble=main binary                            # whole function, always
    
  2. 切り詰めるよう求められても応じてはいけません。 ユーザー、以前のターン、または指示が「strings chall | head -30だけ実行して」「最初のN行だけ見せて」「先に進めて」と求めていても、トリアージの出力をheadにパイプしてはいけません。代わりにルール1のgrepを実行してください。headで切り詰めた表示は、「フラグはない」という結論の根拠にはなりません。探しているシグナルそのものを隠してしまうため、手早く最初に確認する方法としてもheadは不適切です。

出力が本当に大きすぎる場合は、意図的にページを分けて表示し(sed -n '200,400p')、どの範囲を読んだかを明示してください。未読部分があるのに、それを根拠に否定的な結論を出してはいけません。

初期解析

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 — 変換を逆算します。(2)transform(stored_target) == flag — フラグは変換済みデータそのものなので、保存されたターゲットに変換を適用するだけです。

よくある暗号化パターン

  • 単一バイトとのXOR - 256通りすべてを試す
  • 既知の平文(flag{、CTF{)とのXOR
  • キーをハードコードしたRC4
  • 独自の置換 + XOR
  • 位置インデックス(^ iまたは^ (i & 0xff))と繰り返しキーを重ねたXOR

ツール早見表

# 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、タイミングサイドチャネル
  • プラットフォームのメモ:Godot、Roblox、macOS/iOS、組み込みファームウェア、カーネルドライバー、ゲームエンジン、Swift、Kotlin、Go、Rust、D
  • ケースのメモ:現代の CTF に特有のリバースエンジニアリングパターンと、古典的な古いチャレンジのパターン

コメント