提供 CTF 挑戰的二進位漏洞利用技術。當你已經有一個存在漏洞的原生目標或服務,需要將記憶體破壞或底層原語轉換為程式碼執行或權限提升時使用,例如緩衝區溢位、格式化字串、堆漏洞、ROP、ret2libc、shellcode、核心漏洞利用、seccomp 繞過、沙箱逃逸或 Windows/Linux 漏洞利用鏈。當主要障礙是理解二進位檔的功能時請勿使用,應先進行逆向工程。不適用於純粹的網頁漏洞、磁碟或封包鑑識、或獨立的密碼學/數學挑戰。
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 gems(所有平台):
gem install one_gadget seccomp-tools
手動安裝:
- pwndbg — Linux:GitHub,macOS:
brew install pwndbg/tap/pwndbg-gdb - checksec — 包含在 pwntools 中
其他資源
- overflow-basics.md - 堆疊/全域緩衝區溢位、ret2win、canary 繞過、fork 伺服器的 canary 逐位元組暴力破解、結構指標覆寫、有號整數繞過、隱藏 gadgets、基於步長的越界讀取洩漏、透過未檢查 memcpy 長度搭配被呼叫者保存暫存器還原的解析器堆疊溢位
- rop-and-shellcode.md - 核心 ROP 鏈(ret2libc、syscall ROP、rdx 控制、shell 互動)、ret2csu、壞字元 XOR 繞過、特殊 x86 gadgets(BEXTR/XLAT/STOSB/PEXT)、透過 xchg rax,esp 的堆疊切換、sprintf() gadget 鏈繞過壞字元、canary XOR 結尾作為 rdx 歸零 gadget、stub_execveat 系統呼叫作為 execve 替代方案(透過 read() 回傳值)
- rop-advanced.md - 進階 ROP 技術:透過 leave;ret 的雙重堆疊切換至 BSS、SROP(Sigreturn-Oriented Programming)搭配 UTF-8 限制、seccomp 繞過、RETF 架構切換(x64→x32)用於 seccomp 繞過、含輸入反轉的 shellcode、.fini_array 劫持、ret2vdso、pwntools 模板、x32 ABI 系統呼叫別名用於 seccomp 繞過、基於時間的盲 shellcode 滲漏
- format-string.md - 格式化字串漏洞利用(洩漏、GOT 覆寫、盲 pwn、過濾器繞過、canary 洩漏、__free_hook、.rela.plt 修補、儲存 EBP 覆寫用於 .bss 切換、argv[0] 覆寫用於 stack smash 資訊洩漏、.fini_array 迴圈用於多階段漏洞利用、__printf_chk 繞過搭配連續 %p、單次呼叫洩漏 + GOT 覆寫、ROT13 編碼格式化字串漏洞利用透過輸入轉換)
- advanced.md - Seccomp 進階技術、UAF、JIT、特殊 GOT、透過基數轉換的堆疊疊、樹資料結構堆疊分配不足、ret2dlresolve、核心漏洞利用(基礎)
- heap-techniques.md - House of Apple 2(+ setcontext SUID 變體)、House of Einherjar、House of Orange/Spirit/Lore/Force、堆整理、自訂分配器(nginx、talloc)、經典 unlink、musl libc 堆(meta 指標 + atexit 劫持)、tcache stashing unlink 攻擊、不安全的 unlink + top chunk 合併
- heap-techniques-2.md - CTF writeup 堆變體:UAF vtable 指標編碼 shell 引數、未初始化 chunk 殘留指標洩漏、tcache strcpy 空位元組溢位 + 向後合併、相鄰結構函數指標溢位用於 libc 洩漏 + GOT 覆寫、隱藏選單 tcache 毒化、tcache double-free + 偽造 _IO_FILE vtable stdout 劫持、tcache 到 fastbin 提升跨 bin 攻擊、6 位元索引越界 + written_bytes 累加器、IS_MMAPED 位元翻轉用於 calloc'd chunk 的 unsorted bin 洩漏、檔名正則表達式限制的 fastbin 透過僅 LSB 堆指標覆寫、自訂分配器不安全 unlink 到 GOT
- heap-fsop.md - FILE 結構(_IO_FILE)漏洞利用:fastbin stdout vtable 兩階段劫持用於 PIE + Full RELRO、_IO_buf_base 空位元組 stdin 劫持、glibc 2.24+ _IO_FILE vtable 驗證繞過、unsorted-bin 攻擊 stdin IO_buf_end、透過 mp 結構的 unsorted-bin 破壞、realloc(ptr, 0) 作為 free() UAF、單位元組參考計數器繞回 UAF
- advanced-exploits.md - 進階漏洞利用技術(第 1 部分):VM 有號比較、BF JIT shellcode、型別混淆、差一索引破壞、DNS 溢位、ASAN 影子記憶體、含編碼限制的格式化字串、自訂 canary 保留、有號整數繞過、canary 感知部分溢位、CSV 注入、MD5 前映像 gadgets、VM GC UAF slab 重用、路徑遍歷清理器繞過、FSOP + seccomp 繞過透過 openat/mmap/write
- advanced-exploits-2.md - 進階漏洞利用技術(第 2 部分):透過自我修改的位元組碼驗證器繞過、io_uring UAF 搭配 SQE 注入、整數截斷 int32->int16、GC 空參考串聯破壞、無洩漏 libc 透過多 fgets stdout FILE 覆寫、有號/無號字元下溢堆疊溢位、XOR 金鑰串流暴力寫入原語、tcache 指標解密堆洩漏、unsorted bin 提升透過偽造 chunk 大小、FSOP stdout TLS 洩漏、TLS 解構子劫持透過
__call_tls_dtors、自訂影子堆疊指標溢位繞過、有號整數溢位負值越界堆寫入、XSS 到二進位 pwn 橋接 - advanced-exploits-4.md - 進階漏洞利用技術(第 4 部分):Windows SEH 覆寫 + pushad VirtualAlloc ROP、IAT 相對解析、分離程序 shell 穩定性、SeDebugPrivilege SYSTEM 提升、ARM 緩衝區溢位搭配 Thumb shellcode、Forth 直譯器 system 字詞漏洞利用、GF(2) 高斯消去法用於多 pass tcache 毒化、單位元翻轉漏洞利用原語(mprotect + 迭代程式碼修補)、生命遊戲 shellcode 演化透過 still-lifes、UAF 透過選單驅動的 strdup/free 順序、Windows CFG 繞過透過 system() 作為有效呼叫目標、神經網路輸出作為函數指標索引越界、shellcode 唯一位元組限制繞過透過計數器溢位
- advanced-exploits-3.md - 進階漏洞利用技術(第 3 部分):堆疊變數重疊 / 進位破壞越界、1 位元組溢位透過 8 位元迴圈計數器、遊戲 AI 算術平均越界讀取、任意讀寫 GOT 覆寫到 shell、堆疊洩漏透過 __environ + memcpy 溢位、JIT 沙箱逃逸透過 uint16 跳躍截斷、DNS 壓縮指標堆疊溢位搭配多問題 ROP、ELF 程式碼簽章繞過透過程式頭操作、遊戲關卡格式有號/無號座標不匹配、檔案描述符繼承透過缺少 O_CLOEXEC、符號擴展整數下溢在元資料解析中、ROP 鏈建構搭配唯讀原語、4 位元組 shellcode 搭配時序側通道透過持久暫存器、CRC 預言機作為任意讀取、UTF-8 大小寫轉換緩衝區溢位
- advanced-exploits-5.md - 進階漏洞利用技術(第 5 部分):資料解釋漏洞利用 — Chip-8 模擬器越界記憶體用於 ret2libc、雙精度浮點快速排序 canary 重新定位、bloom filter abs(INT_MIN) 負索引越界寫入
- sandbox-escape.md - 自訂 VM 漏洞利用、FUSE/CUSE 裝置、busybox/受限 shell、shell 技巧、process_vm_readv 沙箱繞過、命名管道檔案大小繞過、CPU 模擬器 print opcode Python eval 注入(交叉參考 ctf-misc/pyjails.md 的 Python 沙箱技術)
- kernel.md - Linux 核心漏洞利用基礎:環境設定、QEMU 除錯、堆噴射結構(tty_struct、poll_list、user_key_payload、seq_operations)、核心堆疊溢位、canary 洩漏、權限提升(ret2usr、核心 ROP)、modprobe_path 覆寫、core_pattern 覆寫、kmalloc 大小不匹配堆疊溢位 + struct file f_op 破壞
- kernel-techniques.md - 核心漏洞利用技術:tty_struct kROP(偽造 vtable + 堆疊切換)、透過 ioctl 暫存器控制的 AAW、userfaultfd 競爭穩定化、SLUB 分配器內部(freelist 強化/混淆)、透過核心恐慌的洩漏、MADV_DONTNEED 競爭視窗擴展(DiceCTF 2026)、跨快取 CPU 分割攻擊(DiceCTF 2026)、PTE 重疊檔案寫入(DiceCTF 2026)、addr_limit 繞過透過失敗檔案開啟用於核心記憶體讀寫
- kernel-bypass.md - 核心保護繞過:KASLR/FGKASLR 繞過(__ksymtab)、KPTI 繞過(swapgs trampoline、訊號處理器、modprobe_path/core_pattern 透過 ROP)、SMEP/SMAP 繞過、GDB 核心模組除錯、initramfs/virtio-9p 工作流程、漏洞利用模板、漏洞利用傳遞
- field-notes.md - 詳細 pwn 筆記:堆漏洞利用快速參考、其他漏洞利用筆記、實用指令
何時轉向
- 如果你還不了解二進位檔的功能,請先切換到
/ctf-reverse再嘗試漏洞利用。 - 如果服務實際上是受限 shell、編碼謎題或沙箱語言挑戰,請切換到
/ctf-misc。 - 如果漏洞利用路徑依賴於網頁端點、session 漏洞或上傳原語而非記憶體破壞,請切換到
/ctf-web。 - 如果漏洞需要在漏洞利用前破解密碼學原語,請切換到
/ctf-crypto。
快速入門指令
# 二進位分析
checksec --file=binary
file binary
readelf -h binary
# 尋找 gadgets
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'
# 尋找偏移量的 pattern
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 唯讀 — 需要替代目標(hooks、vtables、回傳位址) |
| NX | 啟用 | 無法在堆疊/堆上執行 shellcode — 使用 ROP 或 ret2win |
| Canary | 存在 | 偵測到堆疊破壞 — 需要洩漏或避免堆疊溢位(使用堆) |
快速決策樹:
- 部分 RELRO + 無 PIE -> GOT 覆寫(最簡單,使用固定位址)
- 完整 RELRO -> 目標
__free_hook、__malloc_hook(glibc < 2.34)或回傳位址 - 堆疊 canary 存在 -> 優先使用堆攻擊或先洩漏 canary
堆疊緩衝區溢位
- 尋找偏移量:
cyclic 200然後cyclic -l <value> - 檢查保護:
checksec --file=binary - 無 PIE + 無 canary = 直接 ROP
- 透過格式化字串或部分覆寫洩漏 canary
- 在 fork 伺服器上逐位元組暴力破解 canary(最多 7*256 次嘗試)
ret2win 搭配魔術值: 溢位 -> ret(對齊)-> pop rdi; ret -> 魔術值 -> win()。堆疊對齊: SIGSEGV 在 movaps = 加入額外 ret gadget。偏移量: 緩衝區在 rbp - N,回傳位址在 rbp + 8,總計 = N + 8。輸入過濾: 確保 payload 避免 memmem() 禁止的字串。Gadgets: ROPgadget --binary binary | grep "pop rdi",或 pwntools ROP() 用於 CMP 立即值中的隱藏 gadgets。完整漏洞利用程式碼請參閱 overflow-basics.md。
解析器堆疊溢位(未檢查的 memcpy)
模式: 自訂檔案解析器(PCAP、圖片、壓縮檔)分配固定堆疊緩衝區,但輸入記錄可能超過其大小。memcpy 在長度驗證前複製,溢位儲存暫存器和回傳位址。必須還原被呼叫者儲存暫存器:rbx 到可讀記憶體(BSS)、迴圈計數器到退出值,然後 ret gadget + win 函數。請參閱 overflow-basics.md。
結構指標覆寫(堆選單挑戰)
模式: 選單建立/修改/刪除包含資料緩衝區 + 指標的結構。將名稱溢位到指標欄位,填入 GOT 位址,然後透過修改寫入 win 位址。完整漏洞利用和 GOT 目標選擇表請參閱 overflow-basics.md。
有號整數繞過
模式: scanf("%d") 無符號檢查;負數量 * 價格 = 負總額,繞過餘額檢查。請參閱 overflow-basics.md。
Canary 感知部分溢位
模式: 溢位緩衝區和 canary 之間的 valid 旗標。使用 ./ 作為無操作路徑填充以達到精確長度。完整漏洞利用鏈請參閱 overflow-basics.md 和 advanced.md。
全域緩衝區溢位(CSV 注入)
模式: 相鄰的全域變數;透過額外 CSV 分隔符號溢位改變檔名指標。完整漏洞利用請參閱 overflow-basics.md 和 advanced.md。
ROP 鏈建構
透過 puts@PLT(puts@GOT) 洩漏 libc,回傳到漏洞函數,第二階段使用 system("/bin/sh")。完整的兩階段 ret2libc 模式、洩漏解析和回傳目標選擇請參閱 rop-and-shellcode.md。
DynELF libc 發現: pwntools.DynELF(leak_func, pointer_in_libc) 遠端解析 libc 符號,無需知道 libc 版本。請參閱 rop-and-shellcode.md。
小型緩衝區中的受限 shellcode: 當緩衝區太小,使用 read() shellcode 存根(< 20 位元組)拉取完整的第二階段 shellcode。請參閱 rop-and-shellcode.md。
原始 syscall ROP: 當 system()/execve() 崩潰(CET/IBT)時,使用 libc 中的 pop rax; ret + syscall; ret。請參閱 rop-and-shellcode.md。
ret2csu: __libc_csu_init gadgets 控制 rdx、rsi、edi 並呼叫任何 GOT 函數 — 無需 libc gadgets 的通用三引數呼叫。請參閱 rop-and-shellcode.md。
壞字元 XOR 繞過: 在寫入 .data 前用金鑰 XOR payload 資料,然後使用 ROP gadgets 原地 XOR 回來。避免空位元組、換行和其他過濾字元。請參閱 rop-and-shellcode.md。
特殊 gadgets(BEXTR/XLAT/STOSB/PEXT): 當標準 mov 寫入 gadgets 不可用時,鏈結晦澀的 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,或重新進入二進位檔的 read 設定 + 堆疊切換。請參閱 rop-and-shellcode.md。
Canary XOR 結尾作為 rdx 歸零 gadget: 當沒有 pop rdx; ret 存在時,跳入 canary 檢查結尾 xor rdx, fs:28h — 當 canary 完整時它會將 RDX 歸零。請參閱 rop-and-shellcode.md。
stub_execveat 作為 execve 替代方案: 當沒有 pop rax; ret 存在時,使用 stub_execveat(系統呼叫 322/0x142)代替 execve — 發送恰好 0x142 位元組,使 read() 回傳值設定 rax。請參閱 rop-and-shellcode.md。
Shell 互動: 在 execve 之後,sleep(1) 然後 sendline(b'cat /flag*')。請參閱 rop-and-shellcode.md。
透過輸入轉換的格式化字串
ROT13 編碼格式化字串: 當輸入在到達 printf 前經過 ROT13/Caesar 轉換時,使用反向轉換預先編碼格式化字串 payload,使其完整到達。請參閱 format-string.md。
核心漏洞利用
addr_limit 繞過透過失敗檔案開啟: 當核心模組設定 addr_limit = KERNEL_DS 但未在錯誤路徑上還原時,強制錯誤(例如將目標檔案設為目錄)以保留來自使用者空間 read()/write() 的核心記憶體存取。請參閱 kernel-techniques.md。
沙箱和模擬器逃逸
CPU 模擬器 eval 注入: 當模擬器的 print opcode 使用 eval('"' + buf + '"') 處理跳脫序列時,透過 ADD opcode 在模擬器記憶體中建構 "+__import__("os").system("cmd")# 以逃脫字串並執行 Python。請參閱 sandbox-escape.md。
進階漏洞利用原語
神經網路函數指標越界: 當二進位檔使用 NN 輸出作為函數指標陣列的索引而無邊界檢查時,重新訓練權重/偏差以產生越界索引,從偏差陣列讀取目標位址。請參閱 advanced-exploits-4.md。
Shellcode 唯一位元組限制繞過透過計數器溢位: 當 shellcode 限制為 N 個唯一位元組時,噴射堆疊以破壞 seen[256] 計數器,然後重新執行 main(跳過 memset),使溢位計數器允許第二次執行時使用任意位元組。請參閱 advanced-exploits-4.md。
深入筆記
一旦確認挑戰確實是漏洞利用密集型,請使用 field-notes.md。
- 堆和分配器筆記:House of Apple、tcache、不安全 unlink、talloc、UAF、FSOP
- 進階漏洞利用筆記:seccomp 繞過、ret2vdso、io_uring、整數截斷、ASAN、時序預言機
- 沙箱和混合筆記:pyjail 交叉、busybox 逃脫、自訂 VM、shell 技巧、路徑清理器
- 核心和 Windows 筆記:核心 playbook、SEH、CFG 繞過、權限提升
- 歷史案例筆記:較舊但仍可重用的 CTF 漏洞利用模式






