ctf-pwn
CTFにおけるバイナリエクスプロイト技術を提供するスキルです。脆弱なネイティブターゲットやサービスがすでに特定されており、バッファオーバーフロー・フォーマット文字列・ヒープバグ・ROP・ret2libc・シェルコード・カーネルエクスプロイト・seccompバイパス・サンドボックス脱出・Windows/Linuxエクスプロイトチェーンなど、メモリ破壊や低レベルプリミティブをコード実行や権限昇格につなげたい場合に使用してください。バイナリの動作解析が主な課題である場合はリバースエンジニアリングを先に行い、純粋なWebの脆弱性・ディスクやパケットのフォレンジック・暗号や数学の問題には使用しないでください。
description の原文を見る
Provides binary exploitation techniques for CTF challenges. Use when you already have a vulnerable native target or service and need to turn memory corruption or low-level primitives into code execution or privilege escalation, such as buffer overflows, format strings, heap bugs, ROP, ret2libc, shellcode, kernel exploitation, seccomp bypass, sandbox escape, or Windows/Linux exploit chains. Do not use it when the main blocker is understanding what the binary does; use reverse engineering first. Do not use it for pure web bugs, disk or packet forensics, or standalone crypto/math challenges.
SKILL.md 本文
CTF バイナリエクスプロイテーション (Pwn)
バイナリエクスプロイテーション (pwn) CTFチャレンジの簡易リファレンスです。各テクニックのワンライナーがここにあり、詳細は補助ファイルを参照してください。
前提条件
Pythonパッケージ (全プラットフォーム):
pip install pwntools ropper ROPgadget
Linux (apt):
apt install gdb binutils strace ltrace qemu-system-x86
macOS (Homebrew):
brew install gdb binutils qemu
Rubyジェム (全プラットフォーム):
gem install one_gadget seccomp-tools
手動インストール:
- pwndbg — Linux: GitHub, macOS:
brew install pwndbg/tap/pwndbg-gdb - checksec — pwtoolsに含まれています
追加リソース
overflow-basics.md- スタック/グローバルバッファオーバーフロー、ret2win、カナリバイパス、カナリバイト単位ブルートフォース(フォークサーバー上)、構造体ポインタ上書き、符号付き整数バイパス、隠しガジェット、ストライドベースOOB読み取りリーク、チェック無しmemcpy長によるパーサースタックオーバーフロー(呼び出し先保存レジスタ復元付き)rop-and-shellcode.md- コアROPチェーン (ret2libc、syscall ROP、rdx制御、シェルインタラクション)、ret2csu、不正文字XORバイパス、エキゾチックx86ガジェット (BEXTR/XLAT/STOSB/PEXT)、xchg rax,espによるスタックピボット、sprintf()ガジェットチェーン(不正文字バイパス用)、カナリXOR終了処理(rdxゼロ化ガジェット用)、stub_execveat syscall(read()戻り値経由のexecveの代替手段)rop-advanced.md- 高度なROP技法:leave;retによるダブルスタックピボット(BSS経由)、SROP (Sigreturn-Oriented Programming) with UTF-8制約、seccompバイパス、RETF アーキテクチャスイッチ (x64→x32) for seccompバイパス、入力反転シェルコード、.fini_array乗っ取り、ret2vdso、pwntools テンプレート、x32 ABIシステムコールエイリアシング(seccompバイパス用)、時間ベースのブラインドシェルコード流出format-string.md- フォーマットストリングエクスプロイテーション(リーク、GOT上書き、ブラインドpwn、フィルターバイパス、カナリリーク、__free_hook、.rela.pltパッチング、保存されたEBP上書き(.bssピボット用)、argv[0]上書き(スタック破砕情報リーク用)、.fini_arrayループ(マルチステージエクスプロイト用)、sequential %pを使用した__printf_chkバイパス、単一呼び出しリーク+GOT上書き、入力変換を通したROT13エンコードフォーマットストリングエクスプロイト)advanced.md- Seccomp高度なテクニック、UAF、JIT、食い違ったGOT、基数変換によるヒープオーバーラップ、ツリーデータ構造スタック低割り当て、ret2dlresolve、カーネルエクスプロイテーション (基本)heap-techniques.md- House of Apple 2(+ setcontext SUID variant)、House of Einherjar、House of Orange/Spirit/Lore/Force、ヒープグルーミング、カスタムアロケータ (nginx、talloc)、古典的なunlink、musl libc ヒープ (メタポインタ + atexit乗っ取り)、tcache stashing unlink攻撃、unsafe unlink + トップチャンク統合heap-techniques-2.md- CTFライトアップヒープバリアント:UAF vtableポインタエンコードシェル引数、未初期化チャンク残存ポインタリーク、tcache strcpy null-byteオーバーフロー + 後方統合、隣接構造体fn-ポインタオーバーフロー(libc リーク + GOT上書き用)、隠しメニューtcacheポイズニング、tcacheダブルフリー + 偽_IO_FILE vtableストdout乗っ取り、tcache-to-fastbin昇格クロスビン攻撃、6ビットインデックスOOB + written_bytesアキュムレータ、IS_MMAPED ビット反転(calloc'd チャンク上の unsorted bin リーク用)、ファイル名正規表現制限fastbin(LSB-only ヒープポインタ上書き経由)、カスタムアロケータ unsafe unlink to GOTheap-fsop.md- FILE構造体 (_IO_FILE) エクスプロイテーション:fastbin stdout vtable 2段階乗っ取り(PIE + Full RELRO用)、_IO_buf_base null-byte stdin乗っ取り、glibc 2.24+ _IO_FILE vtable検証バイパス、unsorted-bin attack on stdin _IO_buf_end、unsorted-bin破損(mp_構造体経由)、realloc(ptr, 0) as free() UAF、単一バイト参照カウンタラップアラウンドUAFadvanced-exploits.md- 高度なエクスプロイト技法 (パート1):VM符号比較、BF JITシェルコード、型混同、オフバイワン インデックス破損、DNSオーバーフロー、ASAN影メモリ、エンコーディング制約付きフォーマットストリング、カスタムカナリ保存、符号付き整数バイパス、カナリ認識部分オーバーフロー、CSV インジェクション、MD5プリイメージガジェット、VM GC UAF スラブ再利用、パストラバーサル サニタイザーバイパス、FSOP + seccompバイパス(openat/mmap/write経由)advanced-exploits-2.md- 高度なエクスプロイト技法 (パート2):バイトコード検証バイパス(自己修正経由)、io_uring UAF with SQEインジェクション、整数切り詰め int32→int16、GC null-reference カスケード破損、leakless libc via マルチfgets stdout FILEオーバーライト、符号付き/無符号char アンダーフロー ヒープオーバーフロー、XOR キーストリーム ブルートフォース 書き込みプリミティブ、tcacheポインタ復号化ヒープリーク、unsorted bin昇格(偽チャンクサイズ経由)、FSOP stdout TLSリーク、TLSデストラクタ乗っ取り(__call_tls_dtors経由)、カスタムシャドウスタックポインタオーバーフロー バイパス、符号付きint オーバーフロー負のOOB ヒープ書き込み、XSS-to-binary pwn ブリッジadvanced-exploits-4.md- 高度なエクスプロイト技法 (パート4):Windows SEH上書き + pushad VirtualAlloc ROP、IAT相対解決、デタッチプロセスシェル安定性、SeDebugPrivilege SYSTEM昇格、ARMバッファオーバーフロー(Thumbシェルコード付き)、Forthインタプリタシステムワード エクスプロイテーション、GF(2)ガウス消去法(マルチパスtcacheポイズニング用)、シングルビット反転エクスプロイテーション プリミティブ(mprotect + 反復コードパッチング)、Game of Lifeシェルコード進化(スティルライフ経由)、メニュー駆動strdup/freeの順序付けによるUAF、Windows CFGバイパス(system()を有効な呼び出しターゲットとして使用)、ニューラルネットワーク出力を関数ポインタインデックスOOBとして使用、シェルコード固有バイト制限バイパス(カウンタオーバーフロー経由)advanced-exploits-3.md- 高度なエクスプロイト技法 (パート3):スタック変数オーバーラップ / キャリー破損OOB、8ビットループカウンタによる1バイトオーバーフロー、ゲームAI算術平均OOB読み取り、任意読み取り/書き込みGOT上書き(シェル用)、__environ + memcpyオーバーフロー経由スタックリーク、uint16ジャンプ切り詰め経由JIT サンドボックスエスケープ、DNS圧縮ポインタスタックオーバーフロー(マルチクエスチョンROP経由)、ELFコード署名バイパス(プログラムヘッダ操作経由)、ゲームレベル形式符号付き/無符号座標ミスマッチ、ファイルディスクリプタ継承(O_CLOEXEC欠落経由)、メタデータパースにおける符号拡張整数アンダーフロー、読み取り専用プリミティブでのROPチェーン構築、4バイトシェルコード(永続レジスタ経由のタイミングサイドチャネル)、CRC オラクルを任意読み取りとして使用、UTF-8大文字小文字変換バッファオーバーフローadvanced-exploits-5.md- 高度なエクスプロイト技法 (パート5):データ解釈エクスプロイテーション — Chip-8エミュレータOOBメモリ(ret2libc用)、倍精度浮動小数点クイックソート(カナリ再配置用)、ブルームフィルタabs(INT_MIN)負インデックスOOB書き込みsandbox-escape.md- カスタムVMエクスプロイテーション、FUSE/CUSEデバイス、busybox/制限シェル、シェルトリック、process_vm_readvサンドボックスバイパス、名前付きパイプファイルサイズバイパス、CPUエミュレータprintオペコードPython eval インジェクション(ctf-misc/pyjails.mdのPythonジェイル技法と交差参照)kernel.md- Linuxカーネルエクスプロイテーション基礎:環境セットアップ、QEMUデバッグ、ヒープスプレー構造体(tty_struct、poll_list、user_key_payload、seq_operations)、カーネルスタックオーバーフロー、カナリリーク、権限昇格(ret2usr、カーネルROP)、modprobe_path上書き、core_pattern上書き、kmalloc サイズミスマッチ ヒープオーバーフロー + 構造体ファイル f_op破損kernel-techniques.md- カーネルエクスプロイテーション技法:tty_struct kROP(偽vtable + スタックピボット)、ioctl レジスタ制御経由AAW、userfaultfdレース安定化、SLUBアロケータ内部(フリーリスト硬化/難読化)、カーネルパニック経由リーク、MADV_DONTNEEDレースウィンドウ拡張(DiceCTF 2026)、クロスキャッシュCPU分割攻撃(DiceCTF 2026)、PTEオーバーラップファイル書き込み(DiceCTF 2026)、addr_limitバイパス(失敗したファイルオープン経由、カーネルメモリ読み取り/書き込み用)kernel-bypass.md- カーネル保護バイパス:KASLR/FGKASLR バイパス(__ksymtab)、KPTIバイパス(swapgsトランポリン、シグナルハンドラ、modprobe_path/core_pattern(ROP経由))、SMEP/SMAPバイパス、GDBカーネルモジュールデバッグ、initramfs/virtio-9pワークフロー、エクスプロイトテンプレート、エクスプロイト配信field-notes.md- 詳細なpwnノート:ヒープエクスプロイテーション簡易リファレンス、追加エクスプロイトノート、便利なコマンド
軸足を変えるべき場合
- バイナリが何をするのか未だに理解していない場合は、それをエクスプロイトしようとする前に
/ctf-reverseに切り替えてください。 - サービスが本当に制限されたシェル、エンコーディングパズル、またはサンドボックス言語チャレンジの場合は、
/ctf-miscに切り替えてください。 - エクスプロイトパスがメモリ破損以上にWebエンドポイント、セッションバグ、またはアップロードプリミティブに依存する場合は、
/ctf-webに切り替えてください。 - 脆弱性がエクスプロイテーション前に暗号プリミティブを破ることを必要とする場合は、
/ctf-cryptoに切り替えてください。
クイックスタートコマンド
# バイナリ分析
checksec --file=binary
file binary
readelf -h binary
# ガジェット検索
ROPgadget --binary binary | grep "pop rdi"
ropper -f binary --search "pop rdi"
one_gadget /lib/x86_64-linux-gnu/libc.so.6
# デバッグ
gdb -q binary -ex 'start' -ex 'checksec'
# オフセット探索用パターン
python3 -c "from pwn import *; print(cyclic(200))"
python3 -c "from pwn import *; print(cyclic_find(0x61616168))"
# libc特定
./libc-database/find puts <leaked_addr_last_3_nibbles>
ソースコード上の危険信号
- スレッド処理/
pthread-> 競合状態 usleep()/sleep()-> タイミングウィンドウ- 複数スレッド内のグローバル変数 -> TOCTOU
競合状態エクスプロイテーション
bash -c '{ echo "cmd1"; echo "cmd2"; sleep 1; } | nc host port'
一般的な脆弱性
- バッファオーバーフロー:
gets()、scanf("%s")、strcpy() - フォーマットストリング:
printf(user_input) - 整数オーバーフロー、UAF、競合状態
エクスプロイト戦略に対する保護の影響
| 保護 | ステータス | 影響 |
|---|---|---|
| PIE | 無効化 | すべてのアドレス(GOT、PLT、関数)は固定 - 直接上書き可 |
| RELRO | 部分的 | GOTは書き込み可 - GOT上書き攻撃が可能 |
| RELRO | 完全 | GOTは読み取り専用 - 代替ターゲットが必要(フック、vtable、戻り番地) |
| NX | 有効化 | スタック/ヒープでシェルコード実行不可 - ROP または ret2win を使用 |
| Canary | 有効 | スタック破砕検出 - リーク化が必要または スタックオーバーフロー回避(ヒープ使用) |
簡易判定木:
- 部分的RELRO + PIE無効化 -> GOT上書き(最も簡単、固定アドレス使用)
- 完全RELRO ->
__free_hook、__malloc_hook(glibc < 2.34)、または戻り番地をターゲット - スタックカナリ有効 -> ヒープベースの攻撃を優先、またはカナリを先にリーク
スタックバッファオーバーフロー
- オフセット検索:
cyclic 200その後cyclic -l <value> - 保護確認:
checksec --file=binary - PIE無効 + カナリ無効 = 直接ROP
- フォーマットストリングまたは部分上書きでカナリリーク
- フォークサーバー上でバイト単位のカナリブルートフォース(最大7*256試行)
マジック値を用いたret2win: オーバーフロー -> ret(アライメント) -> pop rdi; ret -> マジック -> win()。スタックアライメント: movapsでのSIGSEGV = 追加のretガジェット。オフセット: バッファはrbp - N、戻り番地はrbp + 8、合計 = N + 8。入力フィルタリング: ペイロードがmemmem()による禁止文字列を避けることを確認。ガジェット: ROPgadget --binary binary | grep "pop rdi"、またはpwntools ROP()で CMP即値内の隠しガジェット。完全なエクスプロイトコードはoverflow-basics.mdを参照。
パーサースタックオーバーフロー(チェック無しmemcpy)
パターン: カスタムファイルパーサー(PCAP、イメージ、アーカイブ)が固定スタックバッファを割り当てますが、入力レコードはそれを超えることができます。memcpyは長さ検証前にコピーし、保存されたレジスタと戻り番地をオーバーフロー。呼び出し先保存レジスタを復元する必要があります:rbxは読み取り可能なメモリ(BSS)、ループカウンタは終了値、その後retガジェット + win関数。overflow-basics.mdを参照。
構造体ポインタ上書き(ヒープメニューチャレンジ)
パターン: データバッファ + ポインタを含む構造体のメニュー作成/変更/削除。ポインタフィールドにGOT アドレスでオーバーフロー、その後修正経由でwin アドレスを書き込み。完全なエクスプロイトと GOT ターゲット選択テーブルはoverflow-basics.mdを参照。
符号付き整数バイパス
パターン: 符号チェック無しのscanf("%d");負の数量 * 価格 = 負の合計、残高チェックを バイパス。overflow-basics.mdを参照。
カナリ認識部分オーバーフロー
パターン: バッファとカナリ間のvalidフラグをオーバーフロー。正確な長さのために./をno-opパス埋め充として使用。overflow-basics.mdとadvanced.mdを参照。
グローバルバッファオーバーフロー(CSV インジェクション)
パターン: 隣接するグローバル変数;追加のCSVデリミタ経由のオーバーフロー、ファイル名ポインタを変更。overflow-basics.mdとadvanced.mdを参照。
ROP チェーン構築
puts@PLT(puts@GOT)経由でlibc リーク、脆弱性に戻す、system("/bin/sh")を使用してステージ2。完全な2段階ret2libcパターン、リーク解析、戻りターゲット選択についてはrop-and-shellcode.mdを参照。
DynELF libc 発見: pwntools.DynELF(leak_func, pointer_in_libc) リモートでlibcシンボルを解決、libc バージョン未知でも。rop-and-shellcode.mdを参照。
小さいバッファ内の制約シェルコード: バッファが小さすぎる場合、read()シェルコードスタブ(< 20バイト)を使用して完全ステージ2シェルコードを引き出し。rop-and-shellcode.mdを参照。
素のsyscall ROP: system()/execve()がクラッシュ(CET/IBT)する場合、libcからpop rax; ret + syscall; retを使用。rop-and-shellcode.mdを参照。
ret2csu: __libc_csu_init ガジェットはrdx、rsi、ediを制御し、任意のGOT関数を呼び出す — libcガジェット無しの普遍的な3引数呼び出し。rop-and-shellcode.mdを参照。
不正文字XOR バイパス: ペイロードデータをキーでXORして.dataに書き込み、その後ROP ガジェットでXOR を戻す。ヌルバイト、改行、その他のフィルタ文字を回避。rop-and-shellcode.mdを参照。
エキゾチックガジェット (BEXTR/XLAT/STOSB/PEXT): 標準mov書き込みガジェットが利用できない場合、バイト単位のメモリ書き込みのために不明確なx86命令をチェーン。rop-and-shellcode.mdを参照。
スタック ピボット (xchg rax,esp): オーバーフロー が完全ROP チェーンには小さすぎる場合、スタック ポインタを攻撃者制御ヒープ/バッファにスワップ。ピボット前にアドレスをロードするためにpop rax; retが必要。rop-and-shellcode.mdを参照。
rdx 制御: puts()の後、rdxは1に破壊。libcからpop rdx; pop rbx; retを使用、またはバイナリ読み取り設定 + スタック ピボットを再入力。rop-and-shellcode.mdを参照。
カナリ XOR 終了処理を rdx ゼロ化ガジェットとして: pop rdx; retが存在しない場合、カナリ チェック終了処理xor rdx, fs:28hにジャンプ -- カナリが無傷の場合RDXをゼロ化。rop-and-shellcode.mdを参照。
stub_execveat as execve 代替: pop rax; retが存在しない場合、stub_execveat(syscall 322/0x142)を使用 -- 正確に0x142バイトを送信してread()戻り値がraxを設定。rop-and-shellcode.mdを参照。
シェル インタラクション: execveの後、sleep(1)次にsendline(b'cat /flag*')。rop-and-shellcode.mdを参照。
入力変換によるフォーマットストリング
ROT13エンコード フォーマットストリング: 入力がROT13/Caesar-変換されてprintfに到達する場合、逆変換でペイロードを事前エンコードして無傷で到達。format-string.mdを参照。
カーネル エクスプロイテーション
失敗したファイルオープン経由のaddr_limit バイパス: カーネルモジュールがaddr_limit = KERNEL_DSを設定しますが、エラーパスで復元しない場合、エラーを強制(例えば、対象ファイルをディレクトリにする)してユーザースペースread()/write()からのカーネルメモリアクセスを保持。kernel-techniques.mdを参照。
サンドボックスおよびエミュレータ エスケープ
CPUエミュレータprint オペコード Python eval インジェクション: エミュレータのprintオペコードがeval('"' + buf + '"')をエスケープシーケンスに使用する場合、ADD オペコード経由でエミュレータメモリに"+__import__("os").system("cmd")#を構築して文字列をエスケープしてPythonを実行。sandbox-escape.mdを参照。
高度なエクスプロイト プリミティブ
ニューラル ネットワーク 関数ポインタ OOB: バイナリがNN出力を関数ポインタ配列へのインデックスとして使用し、境界チェック無し場合、重みと バイアスを再トレーニングして、バイアス配列からターゲットアドレスを読み取る範囲外インデックスを生成。advanced-exploits-4.mdを参照。
シェルコード固有バイト制限バイパス(カウンタオーバーフロー経由): シェルコードがNの固有バイトに制限されている場合、スタックをスプレーしてseen[256]カウンタを破損、その後メイン再実行(memsetスキップ)で、オーバーフロー カウンタが2回目の実行で任意バイトを許可。advanced-exploits-4.mdを参照。
ディープダイブノート
チャレンジが真にエクスプロイテーション重視であることを確認したらfield-notes.mdを使用。
- ヒープおよびアロケータノート:House of Apple、tcache、unsafe unlink、talloc、UAF、FSOP
- 高度なエクスプロイトノート:seccompバイパス、ret2vdso、io_uring、整数切り詰め、ASAN、タイミングオラクル
- サンドボックスおよびハイブリッドノート:pyjail クロスオーバー、busybox エスケープ、カスタムVM、シェルトリック、パスサニタイザー
- カーネルおよびWindows ノート:カーネルプレイブック、SEH、CFGバイパス、権限昇格
- 歴史的ケースノート:古いがCTFエクスプロイトパターンでまだ再利用可能
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- ljagiello
- リポジトリ
- ljagiello/ctf-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/ljagiello/ctf-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。