安全与风控
已有原生漏洞目标时,把内存破坏或底层原语转为代码执行或提权
适用于 CTF 二进制利用(pwn):已拿到有漏洞的原生程序或服务,需要把缓冲区溢出、格式化字符串、堆漏洞、ROP、shellcode、内核利用、seccomp 绕过、沙箱逃逸或 Windows/Linux 利用链转成代码执行或提权。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
已有原生漏洞目标时,把内存破坏或底层原语特定
解决思路
- 安装并准备工具链:`pip install "pwntools==4.15.0" "ROPgadget==7.7" "ropper==1.13.13"`,或运行 `bash scripts/install_ctf_tools.sh python`。
- 使用 uv 替代安装:`uv venv && uv pip install "pwntools==4.15.0" "ROPgadget==7.7" "ropper==1.13.13"`。
- Linux 上安装:`apt install gdb binutils strace ltrace qemu-system-x86`。
- 可选安装跨架构 ARM/MIPS 工具(Debian/Ubuntu):`apt install qemu-user qemu-user-static gdb-multiarch binutils-multiarch libc6-armhf-cross libc6-arm64-cross libc6-mips-cross`。
- 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 提供,使用 `checksec --file=binary`。
- 按 overflow-basics.md 处理:栈/全局缓冲区溢出、ret2win、canary 绕过、在 forking 服务器上逐字节暴力 canary、结构体指针覆写、有符号整数绕过、隐藏 gadget、基于 stride 的 OOB 读取泄漏、通过未检查 memcpy 长度与 callee-saved 寄存器恢复的解析器栈溢出。
- 按 rop-and-shellcode.md 处理:核心 ROP 链(ret2libc、syscall ROP、rdx 控制、shell 交互)、ret2csu、坏字符 XOR 绕过、冷门 x86 gadget(BEXTR/XLAT/STOSB/PEXT)、通过 `xchg rax,esp` 栈迁移、用 `sprintf()` gadget 链绕过坏字符、canary XOR epilogue 作为 RDX 清零 gadget、`stub_execveat` 作为 execve 替代(通过 `read()` 返回值)。
- 按 rop-advanced.md 处理:高级 ROP:通过 `leave;ret` 双重栈迁移到 BSS、带 UTF-8 约束的 SROP、seccomp 绕过、RETF 架构切换(x64→x32)绕过 seccomp、反转输入的 shellcode、`.fini_array` 劫持、ret2vdso、pwntools 模板、x32 ABI syscall 别名绕过 seccomp、基于时间的盲 shellcode 外传。
- 按 format-string.md 处理:格式化字符串利用(泄漏、GOT 覆写、盲打、过滤器绕过、canary 泄漏、`__free_hook`、`.rela.plt` 修补、覆写 saved EBP 迁移到 `.bss`、覆写 argv[0] 泄漏 stack smash 信息、用 `.fini_array` 循环多阶段利用、用连续 `%p` 绕过 `__printf_chk`、单次调用泄漏 + GOT 覆写、通过输入变换的 ROT13 编码格式化字符串利用)。
- 按 advanced.md 处理:seccomp 高级技术、UAF、JIT、冷门 GOT、通过 base conversion 堆重叠、树数据结构栈分配不足、ret2dlresolve、内核利用基础。
- 按 heap-techniques.md 处理:House of Apple 2(+ setcontext SUID 变体)、House of Einherjar、House of Orange/Spirit/Lore/Force、heap grooming、自定义分配器(nginx、talloc)、经典 unlink、musl libc 堆(meta pointer + atexit 劫持)、tcache stashing unlink 攻击、unsafe unlink + top chunk 合并。
- 按 heap-techniques-2.md 处理:CTF writeup 堆变体:UAF vtable 指针编码 shell 参数、未初始化 chunk 残留指针泄漏、tcache `strcpy` 空字节溢出 + 向后合并、相邻结构体函数指针溢出用于 libc 泄漏 + GOT 覆写、隐藏菜单 tcache poisoning、tcache double-free + 伪造 `_IO_FILE` vtable stdout 劫持、tcache-to-fastbin promotion 跨 bin 攻击、6-bit 索引 OOB + written_bytes 累加器、calloc'd chunk 上翻转 IS_MMAPED 位进行 unsorted bin 泄漏、仅覆写 LSB 堆指针的 filename-regex 约束 fastbin、自定义分配器 unsafe unlink 到 GOT。
- 按 heap-fsop.md 处理:FILE 结构(`_IO_FILE`)利用:fastbin stdout vtable 两阶段劫持用于 PIE + Full RELRO、`_IO_buf_base` 空字节 stdin 劫持、glibc 2.24+ `_IO_FILE` vtable 校验绕过、stdin `_IO_buf_end` 的 unsorted-bin 攻击、通过 `mp_` 结构破坏 unsorted bin、`realloc(ptr, 0)` 当作 `free()` 的 UAF、单字节引用计数回绕 UAF。
- 按 advanced-exploits.md 处理:高级利用(第 1 部分):VM 有符号比较、BF JIT shellcode、类型混淆、off-by-one 索引破坏、DNS 溢出、ASAN shadow memory、带编码约束的格式化字符串、自定义 canary 保留、有符号整数绕过、canary-aware 部分溢出、CSV 注入、MD5 preimage gadget、VM GC UAF slab 复用、路径遍历 sanitizer 绕过、FSOP + 通过 openat/mmap/write 绕过 seccomp。
- 按 advanced-exploits-2.md 处理:高级利用(第 2 部分):通过自修改绕过字节码校验器、带 SQE 注入的 io_uring UAF、int32->int16 整数截断、GC null-reference 级联破坏、无泄漏 libc(通过多次 fgets 覆写 stdout FILE)、有符号/无符号 char 下溢堆溢出、XOR keystream 暴力写原语、tcache 指针解密堆泄漏、伪造 chunk size 提升 unsorted bin、FSOP stdout TLS 泄漏、通过 `__call_tls_dtors` 劫持 TLS 析构器、自定义 shadow stack 指针溢出绕过、有符号 int 溢出负向 OOB 堆写、XSS-to-binary pwn 桥。
- 按 advanced-exploits-4.md 处理:高级利用(第 4 部分):Windows SEH 覆写 + pushad VirtualAlloc ROP、IAT 相对解析、分离进程 shell 稳定性、SeDebugPrivilege 提权到 SYSTEM、ARM 缓冲区溢出与 Thumb shellcode、Forth 解释器 system word 利用、GF(2) Gaussian elimination 多轮 tcache poisoning、单比特翻转利用原语(mprotect + 迭代代码修补)、通过 still-lifes 的 Game of Life shellcode 演化、通过菜单驱动 strdup/free 顺序的 UAF、通过 `system()` 作为合法调用目标绕过 Windows CFG、神经网络输出作为函数指针索引 OOB、通过计数器溢出绕过 shellcode 唯一字节限制。
- 按 advanced-exploits-3.md 处理:高级利用(第 3 部分):栈变量重叠/进位破坏 OOB、通过 8-bit 循环计数器 1 字节溢出、游戏 AI 算术平均 OOB 读取、任意读写 GOT 覆写到 shell、通过 `__environ` + `memcpy` 溢出泄漏栈、通过 uint16 跳转截断逃逸 JIT 沙箱、带多问题 ROP 的 DNS 压缩指针栈溢出、通过程序头操纵绕过 ELF 代码签名、游戏关卡格式有符号/无符号坐标不匹配、通过缺少 O_CLOEXEC 继承文件描述符、元数据解析中的符号扩展整数下溢、只读原语构造 ROP 链、带持久寄存器时间侧信道的 4 字节 shellcode、CRC oracle 作为任意读取、UTF-8 大小写转换缓冲区溢出。
- 按 advanced-exploits-5.md 处理:高级利用(第 5 部分):数据解释型利用——Chip-8 模拟器 OOB 内存用于 ret2libc、双精度浮点 quicksort canary 重定位、bloom filter `abs(INT_MIN)` 负索引 OOB 写。
- 按 sandbox-escape.md 处理:自定义 VM 利用、FUSE/CUSE 设备、busybox/受限 shell、shell 技巧、`process_vm_readv` 沙箱绕过、命名管道文件大小绕过、CPU 模拟器 print opcode 的 Python eval 注入(交叉参考 ctf-misc/pyjails.md 的 Python jail 技术)。
- 按 kernel.md 处理:Linux 内核利用基础:环境搭建、QEMU 调试、堆喷射结构(tty_struct、poll_list、user_key_payload、seq_operations)、内核栈溢出、canary 泄漏、提权(ret2usr、kernel ROP)、modprobe_path 覆写、core_pattern 覆写、kmalloc 大小不匹配堆溢出 + struct file f_op 破坏。
- 按 kernel-techniques.md 处理:内核利用技术:tty_struct kROP(伪造 vtable + 栈迁移)、通过 ioctl 寄存器控制 AAW、userfaultfd race 稳定化、SLUB 分配器内部(freelist 加固/混淆)、通过 kernel panic 泄漏、MADV_DONTNEED race 窗口扩展(DiceCTF 2026)、cross-cache CPU-split 攻击(DiceCTF 2026)、PTE overlap 文件写(DiceCTF 2026)、通过失败文件打开绕过 addr_limit 读写内核内存。
- 按 kernel-bypass.md 处理:内核保护绕过:KASLR/FGKASLR 绕过(`__ksymtab`)、KPTI 绕过(swapgs trampoline、signal handler、通过 ROP 的 modprobe_path/core_pattern)、SMEP/SMAP 绕过、GDB 内核模块调试、initramfs/virtio-9p 工作流、利用模板、利用投递。
- 按 field-notes.md 处理:详细 pwn 笔记:堆利用快速参考、额外利用笔记、有用命令。
- 二进制分析:`checksec --file=binary`、`file binary`、`readelf -h binary`。
- 查找 gadget:`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>`。
- 源码中看到 threading/`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 存在时,栈 smash 会被检测,需泄漏或绕过,或改用堆攻击。
- 快速决策树:Partial RELRO + No PIE -> 做 GOT 覆写(最简单,使用固定地址)。
- Full RELRO -> 目标 `__free_hook`、`__malloc_hook`(glibc < 2.34)或返回地址。
- Stack canary 存在 -> 优先堆攻击,或先泄漏 canary。
- 栈缓冲区溢出找偏移:`cyclic 200` 后 `cyclic -l <value>`。
- 栈缓冲区溢出检查保护:`checksec --file=binary`。
- No PIE + No canary -> 直接 ROP。
- 通过格式化字符串或部分覆写泄漏 canary。
- 在 forking 服务器上逐字节暴力 canary(最多 7*256 次尝试)。
- ret2win with magic value:溢出 -> `ret`(对齐)-> `pop rdi; ret` -> magic -> win()。
- 栈对齐:SIGSEGV 在 `movaps` 中发生 = 添加额外 `ret` gadget。
- 偏移:buffer 在 `rbp - N`,return 在 `rbp + 8`,总偏移 = N + 8。
- 输入过滤:assert payload 避开 `memmem()` 禁用字符串。
- Gadgets:`ROPgadget --binary binary | grep "pop rdi"`,或用 pwntools `ROP()` 找 CMP 立即数中的隐藏 gadget。
- 解析器栈溢出模式:自定义文件解析器(PCAP、图像、归档)分配固定栈缓冲区但输入记录可超出;`memcpy` 在长度校验前复制,溢出保存寄存器和返回地址;恢复 callee-saved 寄存器:`rbx` 指向可读内存(BSS),循环计数器设为退出值,然后接 `ret` gadget + win 函数。
- 结构体指针覆写(堆菜单题)模式:菜单 create/modify/delete 操作含 data buffer + pointer 的结构体;将 name 溢出到 pointer 字段并写入 GOT 地址,然后通过 modify 写入 win 地址。
- 有符号整数绕过模式:`scanf("%d")` 未检查符号;负数量 * 价格 = 负总价,绕过余额检查。
- Canary-aware 部分溢出模式:溢出 buffer 和 canary 之间的 `valid` 标志;用 `./` 作为 no-op 路径 padding 精确控制长度。
- 全局缓冲区溢出(CSV 注入)模式:相邻全局变量;额外 CSV 分隔符溢出改变 filename 指针。
- 构建两阶段 ret2libc:通过 `puts@PLT(puts@GOT)` 泄漏 libc,返回 vuln,第二阶段 `system("/bin/sh")`。
- DynELF libc discovery:`pwntools.DynELF(leak_func, pointer_in_libc)` 在不知道 libc 版本时远程解析 libc 符号。
- 小缓冲区受限 shellcode:缓冲区太小时,用 `read()` shellcode stub(< 20 字节)拉取完整第二阶段 shellcode。
- Raw syscall ROP:当 `system()`/`execve()` 崩溃(CET/IBT)时,用 libc 中 `pop rax; ret` + `syscall; ret`。
- ret2csu:用 `__libc_csu_init` gadget 控制 `rdx`、`rsi`、`edi` 并调用任意 GOT 函数——无需 libc gadget 的通用 3 参数调用。
- 坏字符 XOR 绕过:将 payload 数据与 key XOR 后写到 `.data`,再用 ROP gadget 原地 XOR 回来;避开 null、换行和其他被过滤字符。
- 冷门 gadget(BEXTR/XLAT/STOSB/PEXT):当标准 `mov` 写 gadget 不可用时,串联冷门 x86 指令进行逐字节内存写。
- 栈迁移(`xchg rax,esp`):溢出太小无法放完整 ROP 链时,将栈指针交换到攻击者控制的堆/缓冲区;需要先 `pop rax; ret` 加载迁移地址。
- rdx 控制:`puts()` 后 rdx 被破坏为 1;用 libc 的 `pop rdx; pop rbx; ret`,或重新进入二进制的 read 设置 + 栈迁移。
- Canary XOR epilogue 作为 rdx 清零 gadget:没有 `pop rdx; ret` 时,跳进 canary 检查 epilogue `xor rdx, fs:28h`——canary 完好时会把 RDX 清零。
- stub_execveat 作为 execve 替代:没有 `pop rax; ret` 时,使用 `stub_execveat`(syscall 322/0x142)替代 `execve`——发送恰好 0x142 字节,使 `read()` 返回值设置 rax。
- Shell 交互:`execve` 后 `sleep(1)`,再 `sendline(b'cat /flag*')`。
- ROT13 编码格式化字符串:输入在到达 `printf` 前被 ROT13/Caesar 变换时,先用逆变换预编码格式字符串 payload,使其到达时保持完整。
- 通过失败文件打开绕过 addr_limit:内核模块设 `addr_limit = KERNEL_DS` 但错误路径未恢复时,强制触发错误(例如让目标文件是目录),以保留从用户态 `read()`/`write()` 访问内核内存的能力。
- CPU 模拟器 eval 注入:模拟器 print opcode 使用 `eval('"' + buf + '"')` 处理转义序列时,通过 ADD opcode 在模拟器内存构造 `"+__import__("os").system("cmd")#` 逃逸字符串并执行 Python。
- 神经网络函数指针 OOB:二进制用 NN 输出作为函数指针数组索引且无边界检查时,重新训练权重/偏置产生 OOB 索引,从 biases 数组读取目标地址。
- Shellcode 唯一字节限制绕过(计数器溢出):shellcode 被限制为 N 个唯一字节时,喷射栈破坏 `seen[256]` 计数器,然后重新执行 main(跳过 `memset`),使溢出后的计数器在第二轮允许任意字节。
- 确认题目确实是 exploitation-heavy 后使用 field-notes.md。
- 堆和分配器笔记:House of Apple、tcache、unsafe unlink、talloc、UAF、FSOP。
- 高级利用笔记:seccomp 绕过、ret2vdso、io_uring、整数截断、ASAN、时序 oracle。
- 沙箱和混合笔记:pyjail 交叉、busybox 逃逸、自定义 VM、shell 技巧、路径 sanitizer。
- 内核和 Windows 笔记:内核 playbook、SEH、CFG 绕过、提权。
- 历史案例笔记:较老但仍可复用的 CTF 利用模式。
适用边界 · 注意事项
- 当尚未理解二进制做什么时,不要直接利用;先做逆向。
- 当目标实际是受限 shell、编码谜题或沙箱语言挑战时,不要按二进制利用做;转 misc。
- 当漏洞路径依赖 web 端点/会话/上传,或必须先破解密码原语时,不要按 pwn 做;转 web/crypto。