[TOC]
前言:本文章有借鉴各大OJ、CTF平台等的资源图鉴,有部分内容相似,如有问题本人愿意下架整改,谢谢。
欢迎来到PWN的世界
欢迎来到PWN的世界,这里遍地都是二进制寄存器和栈堆在陪伴着你😄
PWN(读作“砰”,拟声词)一词起源于网络游戏社区,原本表示成功入侵了计算机系统,在CTF 中则是一种题目方向:通过构造恶意输入达到泄漏信息甚至劫持几乎整个系统(getshell)的目的。其实在 CTF 比赛发展初期,赛题通常只与二进制安全相关,因此PWN 是 CTF 领域最原始的方向。在这里,你能深入计算机系统最底层,感受纯粹的计算机科学,感受底层的计算机逻辑….
$$ PWN => 逆向工程+漏洞挖掘+漏洞利用 =>系统劫持 $$
接下来,Expl0rer将和愿意入门PWN的同学一同学习,有问题随时在评论区及QQ交流讨论,In this article, I'll help you figure out what PWN is, why to learn it, and how to go about it.
希望你能坚持下去。
前置声明
我大一是CTF全栈😄,对其他方向也颇有了解,对我而言PWN的前置知识非常多,很多人选择等老师讲完课再去学,我认为这是一个很大的错误,老师只会带你去认识、入门这门课,对于你学PWN来说,所需的前置知识储备差距还是很大的,况且如汇编语言和计算机组成原理这些一般都在大二下学期、大三学习的,那时候已经晚了。既然你已经决定要学PWN了,所以我强烈建议要提前自学这些PWN前置知识。
从开始入门PWN到拿到你的第一个专属flag还需要一段时间,但请耐心沉淀,你的付出一定会迎来回报!
数据转换
在PWN的学习中,我们经常需要和如二进制、十六进制、寄存器等的这些底层数据打交道,因此PWN属于二进制(binary)安全,为什么要说是“二进制”?因为计算机只认识和只会处理二进制信息。与我们日常使用的十进制“逢十进一”不同,“逢二进一”的二进制世界只有“0”和“1”。一位二进制信息称为比特(bit),8 比特为 1 字节(byte),字节通常是计算机处理信息的最小单位,计算机中的信息通常是连续的字节。我们人类所输入给计算机的任何信息如文字、图像、音视频等都可被编码转换为数字信息(二进制比特流)进行处理,需要输出时再解码为原形式。
不同进制间可相互转换,你需要熟悉进制转换方式,其中最重要的是二进制、十进制、十六进制间的转换。
等你输入信息给计算机后,就轮到计算机本身去存储这个数据了,怎么存?为了方便数据类型转换和运算,计算机存储数字信息时,数字再内存中的高低位与人类阅读的高低位相反(从左到右、从上到下逐字阅读),这种数据存储方式称为“小端序存储”,当然你还需要知道大端序,这类知识其实归根于计算机基础中,在网上你可以搜索到这些相关资源,我在这并不多细分讲解,我只会列出方向给你去寻找并学习…
编程语言
既然PWN和逆向程序逻辑有关,我们还需要反推程序运行逻辑并得出“源代码”,此外我们应该先会正向写出一般的程序吧😄。刚入门的你可能懵懵的啥也不懂,那你需要去了解这些,对于PWN学习初期,我们一般面对的是Linux环境下的C语言,再者就是C++咯
时代科技在不停更迭,人这一辈子都在不断学习,光停留在我以及其他大佬所讲述的“干货”是不够的,你需要学会“善用搜索引擎”(学会使用AI大模型),可以使用edge、谷歌、火狐等。
C语言
C语言几乎是每一所高校的工科学生所学的第一门编程语言,C语言运行速度快,历史悠久,很多程序以及新生编程语言如C++都是基于C语言诞生的,大多数PWN题目的程序都由C语言编写,大多数逆向工具如IDApro的逆向出的语言都是类似C语言的伪代码

你需要系统学习C语言,书籍推荐《C Primer Plus》(作者此前用过,好评!),当然学校统一买了其它教材也能凑合用,或者你可以上网找课程也可以如B站大学
当前想速成的你可以去关注C语言中的基础数据类型(int、longlong、unsigned int…)、流程控制(if、else、while、for…)、函数(scanf、puts、gets、strcmp、system、execve、mmap…)、指针、位操作。
C 语言能很好地和汇编语言(详见下文“编译与汇编”)对应,学习两者时应相互结合,理解等效的 C 语句和汇编指令。
等到我们PWN后期深入学习时,就需要额外学习C++甚至其他语言了,毕竟程序语言很多,可不止C和C++,甚至还有Java等等。
Python
Python专为PWN的exp编写而生:为了能编写漏洞利用脚本,你需要学习Python语言。Python语言极易上手,配置好Python环境后还需要安装pwntools等PWN所需的库。
环境搭建
编程环境
说完上面的语言介绍,我们需要配置一些编程环境,这里我推荐是Pycharm和Visual Studio Code,vscode安装在虚拟机上,然后Pycharm和vscode可以安装在主机上,方便你后续学习编程语言。
虚拟机配置
Linux是一种开源的Unix操作系统,因其性能功耗低等的优势如今被常用于服务器,但我们日常使用的PC操作系统是Windows系统。为了和题目所在的编译环境兼容少出bug以及避免环境污染主机(CTF工具很多,放在主机不太好),我们需要配置一台Linux系统的虚拟机,这里推荐安装Ubuntu虚拟机(当然之前有配置好Kali也勉强可以)或使用docker,网上教程很多,自行寻找。
PWN环境搭建
安装好Linux环境后,还需要继续搭建配置PWN的环境,这里有一篇文章值得你去读:
也可以看看CSDN上的歪插YX大佬的博客文章:
总之你至少需要:
- Linux的Python环境+pwntools
- 逆向分析工具如IDA
- Linux的动态调试器如GDB+
pwndbg - checksec、one_gadget、seccomp-tools、LibcSearcher、ropper
一个PWN的标准解题思路大概是:
- 用
checksec检查保护机制(详见可以看我的文章:PWN-1_Linux保护机制) - 用逆向分析工具(如IDA)反汇编编译挖掘漏洞
- 使用GDB+pwndbg调试确认漏洞细节
- 用Python+pwntools编写利用脚本
libc 和 ld 分别是 Linux C 标准库和动态链接器。我们用 C 语言编写程序时经常调用一些“从天而降”的函数(printf、scanf…),它们其实就在 libc(通常为 GNU 提供的glibc)里,ld 则搭起你的程序和这些函数间的“桥梁”。Linux 系统中几乎所有软件都需要用到它们!
Linux操作
既然PWN需要在Linux-Ubuntu中操作,那么在解题过程难免会使用Linux的一些操作指令,那么你应该直到cd、ls、chmod、file、cat、grep、strings等基础指令以及管道、重定向概念,在此期间你会接触到计算机组成原理的部分知识,详见可以看看我的文章PWN-1
在计算机领域,“shell”是一种计算机程序,它将操作系统的服务提供给人类用户或其他程序,在 Linux 中通常指命令行界面。
对于 PWN,一个很重要且必要的命令行工具是Netcat(nc 命令),它能用来连接 Pwn 题目的在线环境。Netcat 是一个强大的多功能网络工具,目前你只需要知道一种用法:nc <ip> [端口]
到这里你已经初步了解并接触PWN了,你还需要直到一些Linux常用的系统调用(syscall)——open、read、write、mmap、execve等和文件描述符fd(file descriptor)的概念:stdin-0、stdout-1…,此外你需要知道Linux程序运行所经历的过程(动态链接、got、got.plt表的调用,栈堆变化等等)。
我要晕了/(ㄒoㄒ)/~~….看看我的文章PWN-1,我总结了一些。
编译
看到这里累死了,你或许会能看懂C语言了,但不止于此哦,我们必须要熟悉程序编译过程和基本的汇编语句,就是说我们需要学习汇编语言。你需要了解ELF文件格式,了解预处理->编译->汇编->链接(静态or动态)的过程、进程虚拟内存空间(栈、BSS段、数据段、代码段TEXT、data段、rodata等等)。理解调用栈结构及其增长方向与数据存储增长方向相反是PWN前期学习的一大重点。
汇编
对于汇编语句,平时的PWN程序一般是x86 CPU指令集(本文默认amd64位),32位和64位的汇编语言还是有差别的,但大致相同,至少要看懂mov、lea、add、sub、xor、call、ret、jmp、cmp、pop、nop、push等,这是一大难点哦。
另外一大难点就是CPU寄存器,认识下64位的rsp、rip、rbp、rax这些,以及32位的esp、ebp、eip等。重点认识有特殊用途的寄存器。
在做 Pwn 题时,有时你需要先在适当位置填入 shellcode(用于获取 shell 的汇编码)再劫持控制流(详见下文)至此处以执行。你需要知道计算机在汇编层面是如何调用函数的。具体而言,你需要知道并牢记 amd64 System V ABI 函数调用规约:调用函数时的部分参数通过寄存器(rdi、rsi、rdx、rcx、r8、r9)传递其余通过栈传递,32 位系统直接通过栈传递参数(从右至左入栈);函数返回值也由寄存器(rax)传递。除了函数调用,你还需要知道 syscall 的系统调用号与参数的传递方式(rax…),这与函数调用类似。(总之:善用搜索引擎)
学习路线
初步了解完PWN了,要开始了吗?前置知识可以看看我的文章—PWN 前置知识 - Expl0rer.Ct,最好边学边做。学习PWN一定不能一直看书,这样思维会固化,需要随时应用,学一个知识点做一道题,光看完所有知识只会让你望而却步,反而会被庞大的前置知识劝退、打击自信心,学习重在反馈,这样才会有继续学习下去的动力,我的建议是多看师傅们博客的文章和writeup(赛后复盘),多做题,不懂就去查询或者问虚心请教师傅(行业通称)。
建议看在线资源或者博客文章,书籍信息一般具有滞后性,当然也不反对看各大战队出版的具有总结性的书籍。
作者也是厚脸皮去找大佬请教的,
基本上来看,入门PWN大致是配置好环境就开始学习编程语言——C、Python,了解并学会使用反汇编器如IDA,接着进一步能看懂C伪代码,然后学习汇编语言,熟练使用Linux命令行操作命令,接下来学习PWN的前置知识,可以参考我的文章PWN 前置知识 - Expl0rer.Ct中的PWN-1、PWN-2、PWN-3、PWN-4等(正在更新ing…)。边学边刷题,我这里以ctfshow-PWN入门这套题为例(付费),buuctf也行,还有很多刷题网站,可以了解我的博客技术链接 | Links
IDA使用
常用的快捷键有以下:
- g跳转到指定地址。
- a将数据转换成字符串。
- shift+F12打开字符串窗口,可以找出所有字符串。
- ctrl+w保存IDA数据库,保留你当前的工作痕迹,下次打开时就从当前进度继续逆向基础上继续啦。
- n更改变量名,方便记名和识别关键函数。
- /在伪代码界面下写下注释。
更多IDA快捷键可以了解IDA 使用指南。
GDB+pwndbg
随着PWN的进阶,不能局限于IDA静态分析程序了,接下来就是调试了,调试能更好帮助我们了解这个程序的执行流程,那我们需要必备的gdb调试器,它能动态地帮助我们了解当前程序运行的细节(如真实的缓冲区大小、寄存器地址等)

-
start GDB会寻找程序的入口并下断点,然后执行到该断点。
-
run 简写为r,运行程序,与start的区别是,run 之后将一直执行到程序的结束或者断点,通过 run abc,可以以 abc 为参数运行。
-
next 简写为 n,源代码级别的调试,运行下一行代码。
-
nexti 简写为 ni,汇编指令级别的调试,运行下一个指令。
-
step 简写为 s,下一行代码,当遇到函数的时候会步入函数。
-
stepi 简写为 si,下一行指令,当遇到函数的时候会步入函数。
-
info register 简写为 i r,查看当前寄存器信息。
-
disassemble 简写为 disass,反汇编所给地址或寄存器中所给地址处的指令如disass $rip,查看当前 rip 处的指令,disass 0x40112b,查看地址 0x40112b 处的指令。
-
break 简写为 b,下断点,可以通过 info b 查看当前下的所有断点,以及通过 b*$rebase(<offset>) 通过相对程序基址的偏移下断点(当找不到入口信息,无法start 的时候,常通过这个进行下断点)
-
vmmap 查看程序的地址映射
-
checksec pwndbg 中集成了 pwntools 的一些命令,checksec 就是其中一个,查看可执行文件的保护机制。
-
cyclic 同样是 pwntools 的一个命令,能产生不重复的模式字符串,常用于确定栈偏移,如 cyclic 15 能产生“aaaaaaaabaaaaaa”。
-
quit 简写为 q,退出当前调试。
-
crtl + c 中断被调试的程序,举个例子,比如当前程序跑到了 read,阻塞在了接收输出的时候,此时可以通过 crtl + c 中断程序的运行,此时你可以查看程序中断时的寄存器、栈、内存、调用栈等状态。
-
TAB 进行命令的补全。
-
aslr on/off 开启或者关闭 ASLR(见下文),下一次运生效。
-
stack 查看当前栈的信息。
-
x 通过x/i打印指令,x/s 打印字符串,x/x 打印十六进制数等。这个的参数比较多,建议自行查阅资料来了解。
-
tele 是 pwntools 提供的一个命令,可以自动解析该地址处的内容及引用,但是它解释指令的时候不一定正确,反汇编指令仍推荐 x/i。
Pwntools
看到这里你配置好pwntools了吗?这是一个强大的Python库,它能够进行自动程序交互,有sendline、recvuntil、remote、connect等函数代替我们和程序进行交互(尤其在无法用键盘正常输入不可见字符以及“二进制”信息时,优势显现)。我推荐你学习一下 pwn college 中的pwntools模块
这里给大家看看pwntools结合pwndbg如何进行调试,在脚本中指定用context。
64位:
|
|
32位:
|
|
之后需要指定终端,这个设置告诉 pwntools 启动一个 新终端窗口/tab/pane 来运行 GDB,而以下是几种常见的终端。(选用)
|
|
总之pwntools很大,慢慢学!
在编写exp难免需要一边调试一边修改,就需要用gdb调试,在脚本中通过 gdb.debug() 或者gdb.attach(<process>) 启动 gdb,两者的区别是,前者是从头启动程序,并自动 attach 到 GDB,而后者是attach 到已有进程进行调试,需要在 attach 之前通过process(<path>) 启动程序。
当你成功入门PWN并能学会独立编写exp时再看到这里,我想说
recv()和send(...)很方便,但我强烈建议使用recvuntil(…)和sendafter(…)或者sendlineafter(…),就是为了exp的严谨和衔接性,以免各种本地和远程环境不符的情况。sendafter、sendlineafter等这类函数的首个接收参数的(“接收的字符”,payload),接受的字符不宜过长,也别忘了\n,pwntools库函数的参数和返回值类型通常为 bytes,传入字符串字面量时应在前加上 b 标记(例如 b"I am Expl0rer!!" ),使其成为 bytes(python2不会强调要求,python3会强调要求且有可能报错)
互联网时代的到来
当前,AI赋能时代,AI几乎无所不能了,我们的父辈都需要通过图书馆查阅相关书籍,现在的我们只需要通过搜索引擎或者AI检索,技术存在壁垒这是铁一般的事实,AI的崛起,让你身边有了许许多多的百科全书式的虚拟老师,如DeepSeek、豆包、ChatGPT,虽然AI大模型在当前仍有一些缺陷不是什么情况都是百分百给出正确的答案,但是对于大多数的问题,ta都能给出一个正确的答案还有分析过程,善用AI能够帮助你快速的学习和补漏,但不是让你完全依赖AI,ta只是一个辅助工具,自己动手才会进步!


请记住,如果AI没用好就会成为一把剑🗡反噬你,但是你能用好AI那ta就是一把能帮你斩下险阻的最锋利的🗡!
普遍漏洞利用
-
整数溢出——数学世界整数有无穷多,但由于内存限制,计算机中补码表示的“整数”有上下限。通过输入超大数字溢出或者利用有符号整数(负数)强转为无符号整数可以构造超大数字,从而绕过检查或越界写入。
-
栈缓冲区溢出——最经典的漏洞,通过越界写入修改函数返回地址或栈指针从而实现劫持控制流和栈迁移(篡改栈基址 rbp/ebp)
-
ROP(返回导向编程)攻击链构造——这是PWN的一个需要重点突破的攻击手法,也就是ret2xxxx:ret2text、ret2libc、ret2syscall、ret2system、ret2、ret2shellcode、ret2csu、SROP等,这也是栈缓冲区溢出的主要目的。
进阶:通过
ropper、ROPgadget等工具寻找该pwn程序中gadgtes,结合溢出漏洞去构造调用链控制程序执行流甚至能执行几乎任何行为(通常open、read、write)。
Linux安全机制
我们需要熟悉这些保护机制的原理以及性质作用:
- NX(No execute)——无法简单地布置shellcode。
- Canary(金丝雀)——检查缓冲区是否溢出,如有溢出立刻终止程序运行。
- ASLR/PIE——地址随机化保护,使攻击者难以预测程序的内存结构,增加攻击难度。
- RELRO——通过将动态链接程序的全局偏移量表(GOT)在程序启动后设置为只读,防止通过修改其中数据结构进行攻击。
- Seccomp——沙箱保护机制,可以限制程序使用的syscall。
- CFI(IBT / SHSTK)—— 控制流完整性保护,可以阻止 ROP 攻击,抑制 COP、JOP 攻击。
知识输出
PWN是一个庞大的方向,对于枯燥的寄存器、gadget、栈堆漏洞利用、内核kernel等等都是一个个难啃的硬骨头,俗话说基础不牢,地动山摇,我们需要时常巩固自己的知识体系,WP是有必要写的,复盘自己的学习情况,再用自己的描述去表达出来记录在WP中,当然可以学作者这样开个博客,把这些文章放上去,给别人看,达成互相技术交流,别人请教你的同时不仅提升了自己的自信心,还进行了知识输出巩固了自己的知识理解。
写博客和WP我建议用Markdown,它是一种轻量级标记语言,用于编写格式简单、易读,我们在学习中通常需要保留学习痕迹或者记录笔记,最重要的,编写 Writeup 通常也采用 Markdown,因此这里推荐使用一些 Markdown 编辑器进行编写,如 Typora 和 Notion 等,上手之后非常方便。
总结
感谢你读到这里,PWN真是一个很难入门的方向,冗长的前置知识,漫长的打地基过程,光是前置知识就够劝退很多同学啦,等你逐步入门了并学到中阶PWN,这时以后的方向学习就靠你了,可以是Iot、物联网安全、车联网安全、工控等等都和PWN二进制安全相关的,但以后你可能还要学习CTF的RE逆向方向,毕竟:
$$ PWN => 逆向工程+漏洞挖掘+漏洞利用 =>系统劫持 $$逆向知识还是需要的,只不过当前阶段重在漏洞利用挖掘这方面,当你打爆靶机的那一刻,整个世界都是属于你!❀😄
我们的努力都不会白费,历尽千帆,我们终将顶峰相见!至此致敬一路上带我入门、一起相互交流的UU和学长学姐😘
我的博客有很多资源,入门PWN的知识体系我总结的七七八八了,您要不嫌弃可以去看看,感兴趣可以一起来交流吧!
本文借鉴参考了XDCTF-PWN的入门指南文章及各大CTFwiki
作者:Expl0rer.Ct
时间:2025.11.07