PWN学习指北

2025/11/13

这是一条关于自己制定的PWN学习路线的指南

引言

什么是PWN?

PWN是在网络安全竞赛中的一个重要方向,全称来源于英语单词 “own” 的黑客俚语写法,意为“攻陷”或“控制”。在计算机安全语境中,pwn掉一台机器就意味着成功利用系统漏洞,获取对该系统的控制权。

PWN在CTF中的定义

在CTF比赛中,PWN类题目主要考查参赛选手对于二进制程序漏洞的分析与利用能力。选手需要通过逆向分析与调试手段,找出程序中的漏洞,并编写利用脚本,实现对目标程序的控制,如劫持程序执行流、执行 shellcode、读取 flag。

所需编程语言

C 语言

  1. 为什么 C 语言对于PWN很重要 许多系统软件、服务、和CTF题目大多数都是用C/C++编写,二进制漏洞的大多是根源是C层面的内存操作(指针、缓冲区…)
  2. IDA 此外在我们使用IDA反编译的时候出现的伪代码大多是都是伪C代码,他们大多是像以下这样
int __fastcall main(int argc, const char **argv, const char **envp)
{
  _BYTE v4[32]; // [rsp+0h] [rbp-20h] BYREF

  setbuf(stdout, 0);
  puts("QLNUCTF_Pwn");
  puts("Please enter your payload...");
  __isoc99_scanf("%s", v4);
  return 0;
}

所以我认为学习C语言就是可以帮助我们快速的分析二进制程序

Python

Python是我们在PWN环境中,编写攻击命令最常应用的编程语言

汇编

汇编是把程序“拆解成指令”,我觉得漏洞利用的本质就是“控制执行流(指令地址)”,只有看懂汇编,才能理解漏洞利用的本质(但是这个在前期对于新手有些难)

环境搭建

PWN类题目的题目学习还需要搭建与其多对应的环境

Linux

我觉得对于做PWN的环境,还是在Linux中去做更加舒服一点,这里的Linux系统我推荐的是Ubuntu,很多 CTF 题和训练题是在 Debian/Ubuntu 或兼容的环境下编译、测试和部署的。Ubuntu 的默认 glibc、gcc 版本、库路径与题目环境更接近,能减少“本地能跑、远端跑不了”的麻烦。

PWN环境

PWN环境在Linux中的搭建我已经在上一版PDF中详细讲解过了这里就不在过多赘述 然后这里是PWN题的一些基本流程

  1. 先检查是什么架构的,开启什么保护(checksec)
  2. 替换与题目相同的libc,ld文件(patchelf)
  3. IDA反编译
  4. GDB调试
  5. 编写并利用脚本

基础知识

Linux基础命令

因为我们PWN环境是在Linux系统上搭建的,而且大多数的PWN题目也是在Linux系统上搭建的,那么我们就需要学习一些关于Linux的基础命令,以便于我们更好的寻找FLag或者查询东西,像是查看文件内容的cat,查看当前目录中存在那些文件的ls等等,都需要我们的学习

Netcat 的使用

大多数的题目都需要我们使用Netcat来连接我们的pwn题目,并且我们并不需要了解它太多的东西,只知道一条就已经完全足够了nc ip port

Linux底层

这是相对于后期的东西,前期可以先不着急学习此处 Linux底层我们使用最多的就是系统调用,比如64位的syscall,32位int 0x80,在我们使用这些的时候就需要一些寄存器的顺序之类的东西

常用软件

一些常用的软件我已经在PWN环境搭建这一PDF中详细教学,这里只提到某些软件

IDA

这是我们常用的二进制程序反编译工具

GDB

这是我们在动态调试的时候所使用到的工具

pwntools

这是我们在编写攻击代码的时候所使用的工具

漏洞学习

简单类

  1. 整数溢出
  2. 格式化字符串
  3. 缓冲区溢出

栈溢出

  1. ret2text
  2. ret2libc
  3. ret2syscall
  4. ret2shellcode 等等…还有很多这里我的建议是从CTF Wiki 上了解

堆溢出

这个是相对于比较后期的东西

  1. 堆溢出
  2. Off-By-One
  3. Unlink
  4. Use After Free 等等…这些我还是建议是从CTF Wiki 上了解

网站推荐

我在这里推荐几个我比较常用的刷题网站

NSS CTF

BUUCTF