第一章: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,有几个概念你必须刻在脑子里:

  1. 程序内存布局——代码段、数据段、BSS段、堆、栈。每个区域的作用和权限。
  2. 函数调用栈——EBP/RBP、ESP/RSP、返回地址、局部变量的排列方式。
  3. 指令指针(EIP/RIP)——控制它,就控制了程序的执行流。
  4. 系统调用(syscall)——用户态进入内核态的通道。execve、mmap、mprotect是常客。
  5. 保护机制——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()可以快速确定溢出偏移量。我当年手算偏移量算了半年才知道这个函数……

下面这张图是我自己整理的知识体系框架,你可以把它当成学习地图:

CTF PWN 知识体系框架 CTF PWN 知识体系框架 PWN 漏洞利用 基础能力 漏洞类型 保护机制 工具链 C语言 汇编(x86/x64) 操作系统 内存布局 栈溢出 堆利用 格式化字符串 整数溢出 Canary NX PIE RELRO pwntools gdb/pwndbg IDA/Ghidra ROPgadget 学习顺序:基础能力 → 漏洞类型 → 保护机制 → 工具链 每个环节都要动手写exp,光看是学不会PWN的

最后说一句:PWN这条路没有捷径。我见过太多人收藏了一堆教程,结果连一个ret2text都没亲手写过。别做收藏家,做实践者。从今天开始,装好环境,写你的第一个exp。