第一章:CTF与PWN概述
各位同学好,我是你们的二进制漏洞利用教练。在开始之前,我想先聊聊CTF到底是什么——说白了,CTF(Capture The Flag)就是一场黑客技术的奥林匹克。你作为攻击方,要在规定时间内从目标系统里找到隐藏的"旗帜"(Flag),提交它来得分。
我个人最早接触CTF是在2014年,那时候连栈溢出是什么都不清楚。踩了无数坑之后,才慢慢摸清门道。今天这一章,我们就先把地基打牢。
1.1 CTF竞赛简介
CTF竞赛主要分为三种形式:
| 类型 | 特点 | 代表赛事 |
|---|---|---|
| Jeopardy(解题模式) | 分类出题,按题目分值计分 | DEF CON Quals、HITCON |
| Attack-Defense(攻防模式) | 每队维护自己的服务器,同时攻击对手 | DEF CON Finals、*CTF |
| 混合模式 | 前两者结合,先解题后攻防 | XCTF联赛、TCTF |
PWN属于Jeopardy模式下的一个独立分类。你想想看,一个CTF比赛里通常有Web、Reverse、Crypto、Misc、PWN五个大类。PWN是唯一一个需要你真正"打穿"一个二进制程序的题型。
核心认知:PWN的本质是"利用程序漏洞,劫持控制流,执行任意代码"。其他题型是"找",PWN是"打"。
1.2 PWN题型分类
我习惯把PWN题目按漏洞类型分成这几类:
- 栈溢出(Stack Overflow)——最经典的入门题型。覆盖返回地址,控制EIP/RIP。
- 堆利用(Heap Exploitation)——难度陡增。涉及堆块管理、UAF、Double Free等。
- 格式化字符串(Format String)——利用printf类函数的参数解析漏洞。
- 整数溢出(Integer Overflow)——绕过长度检查,触发后续越界。
- 逻辑漏洞(Logic Bug)——程序逻辑设计缺陷,比如条件竞争、权限绕过。
- 异架构漏洞(ARM/MIPS/RISC-V)——非x86平台上的利用,指令集差异大。
嗯,这里要注意:很多新手一上来就啃堆利用,结果被glibc的malloc源码劝退。我建议先从栈溢出入手,把基本功练扎实。
我的建议:先花两周时间,把ret2text、ret2shellcode、ret2libc这三个栈溢出套路吃透。之后再碰堆。
1.3 二进制漏洞利用基础概念
要搞PWN,有几个概念你必须刻在脑子里:
- 程序内存布局——代码段、数据段、BSS段、堆、栈。每个区域的作用和权限。
- 函数调用栈——EBP/RBP、ESP/RSP、返回地址、局部变量的排列方式。
- 指令指针(EIP/RIP)——控制它,就控制了程序的执行流。
- 系统调用(syscall)——用户态进入内核态的通道。execve、mmap、mprotect是常客。
- 保护机制——Canary、NX、PIE、RELRO、ASLR。每个机制对应一种绕过手法。
我在项目中遇到过最尴尬的事:写了一个完美的ROP链,结果忘了目标开了PIE,所有地址都偏移了。从那以后,我每次写exp前第一件事就是checksec。
避坑指南:我曾经在比赛里花了两个小时调试一个栈溢出,最后发现是Canary没绕过。记住:checksec + file + strings 三板斧,开局必做。
1.4 学习路线与工具链概览
学习路线我建议按这个顺序走:
| 阶段 | 内容 | 预估时间 |
|---|---|---|
| 基础 | C语言、汇编(x86/x64)、操作系统原理 | 2-4周 |
| 入门 | 栈溢出(ret2text → ret2shellcode → ret2libc) | 2-3周 |
| 进阶 | 格式化字符串、整数溢出、ROP链构造 | 3-4周 |
| 高阶 | 堆利用(fastbin、tcache、unsorted bin) | 4-6周 |
| 异架构 | ARM/MIPS基础、交叉编译、QEMU调试 | 3-4周 |
工具链方面,我日常必用的有这些:
- pwntools——Python库,写exp的瑞士军刀。没有它我都不想打PWN。
- gdb + pwndbg/peda——动态调试。看内存、看寄存器、看堆栈。
- IDA Pro / Ghidra——静态逆向。分析程序逻辑,找漏洞点。
- one_gadget——找libc里的execve("/bin/sh")单地址。
- ROPgadget——从二进制里提取gadget,拼ROP链。
- QEMU——模拟异架构程序,本地调试ARM/MIPS。
小技巧:pwntools的cyclic()和cyclic_find()可以快速确定溢出偏移量。我当年手算偏移量算了半年才知道这个函数……
下面这张图是我自己整理的知识体系框架,你可以把它当成学习地图:
最后说一句:PWN这条路没有捷径。我见过太多人收藏了一堆教程,结果连一个ret2text都没亲手写过。别做收藏家,做实践者。从今天开始,装好环境,写你的第一个exp。