PWN环境配置
pwntools 是一个用于 CTF 和漏洞利用开发的 Python 库,提供本地执行、远程连接、shellcode 生成、ROP 链构建、ELF 解析等功能。
这个写 PWN 脚本的。
Pwntools 对 Ubuntu 12.04 和 14.04 支持较好,同时也支持 Debian、Arch、FreeBSD、OS X 等系统。
sudo apt-get update
sudo apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential
sudo pip install --upgrade pwntools
from pwn import *
不报错应该就装好了。
process()
remote()
p32() / p64()
asm()
shellcraft
ELF()
ROP()
GDB
GDB(GNU Debugger)是 GNU 提供的调试器。
调试程序的。
sudo apt-get update
sudo apt-get install gdb
gdb
pwndbg
Pwndbg 是一个 GDB 插件,面向漏洞利用和逆向分析,可以显示寄存器、栈、反汇编代码以及内存信息。
这个装到 GDB 上。
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh
cat ~/.gdbinit
IDA Pro
IDA Pro,全称 Interactive Disassembler Professional,是一款交互式反汇编工具。
支持:
Intel x86
x86-64
ARM
MIPS
PowerPC
68000
Z80
8051
看汇编的。
目前用 IDA Pro 6.8。
cyclic
cyclic 200
程序崩溃以后:
cyclic -l 0x6161616c
找 offset。
buffer
↓
return address
checksec
checksec 用来检查 ELF 程序的安全保护。
RELRO
Stack Canary
NX
PIE
看保护的。
sudo apt-get install checksec
checksec --file=/usr/bin/ls
RELRO STACK CANARY NX PIE
Partial RELRO No canary found NX enabled No PIE
NX
shellcode
Canary
栈
PIE
地址
RELRO
GOT
ROPgadget
ROPgadget 用于搜索二进制程序中存在的 ROP gadgets。
ROP,Return-Oriented Programming。
pop rdi
ret
git clone https://github.com/JonathanSalwan/ROPgadget.git
cd ROPgadget
sudo python setup.py install
ROPgadget --binary ./test
ROPgadget --binary ./test | grep "pop rdi"
pwntools
GDB
pwndbg
IDA Pro
cyclic
checksec
ROPgadget
栈溢出
ret2text
ret2shellcode
ROP
2017年4月 补充
GEF(GDB Enhanced Features)也是一个 GDB 增强插件,用于 Linux 下的漏洞利用、逆向分析和程序调试。
git clone https://github.com/hugsy/gef.git ~/gef
然后在 .gdbinit 中加载:
echo "source ~/gef/gef.py" >> ~/.gdbinit
检查:
cat ~/.gdbinit
注意路径。
错误:
source "~/gef/gef.py"
正确:
source ~/gef/gef.py
如果碰到 GDB 自动加载安全限制:
set auto-load safe-path /
GEF 和 pwndbg 差不多也是给 GDB 加功能的。
2026年7月 补充
上面是这篇东西最早的样子。
那时候还是小学,印象里经常就是放学回家,坐到电脑前打开百度,搜到 PWN、GDB、IDA 之类的东西,然后一个页面一个页面往下翻。看到觉得可能有用的内容,就复制一段下来;有时候在下面写一句“这个干嘛的”“看保护的”“调试程序的”,更多时候甚至什么都不标。
反正是写给自己看的。当时觉得自己以后再打开,大概自然就知道这些东西是什么意思。
实际上这篇东西写完以后,我好几年都没有再看过。
而且截止原文发布的时候,上面很多命令我并没有全部操作成功。有些真的跑过,有些只试了一部分,还有不少纯粹就是从百度找到以后先记下来。我当时也没有什么“搭建一套完整 PWN 学习环境”的概念,就是看到一个记一个。
2026 年重新整理的时候,我不准备把上面的东西删掉。那些跳跃、没有解释的术语和只有一句话的备注,本来就是当时的样子。
不过如果只剩上面的原稿,现在已经基本没法正常读了。所以下面把当时记录的东西重新整理一遍。
PWN环境配置
开始学习 PWN 之前,先把基本环境搭起来。
这一阶段不需要一次装一大堆工具,能够完成:
运行程序
动态调试
静态分析
检查保护
构造 payload
搜索 gadget
基本就够了。
最常用的一套工具大概包括:
pwntools
GDB
pwndbg / GEF
IDA Pro
cyclic
checksec
ROPgadget
后面做题遇到新的需求,再继续补其他工具即可。
pwntools
pwntools 是一个用于 CTF 和漏洞利用开发的 Python 库,提供本地执行、远程连接、shellcode 生成、ROP 链构建、ELF 解析等功能。
Pwntools 对 Ubuntu 12.04 和 14.04 支持较好,同时也支持 Debian、Arch、FreeBSD、OS X 等系统。
先安装 Python、pip 和相关依赖:
sudo apt-get update
sudo apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential
然后安装 pwntools:
sudo pip install --upgrade pwntools
安装完成后进入 Python:
from pwn import *
如果没有报错,说明基本安装成功。
后面写 EXP 时,很多常用功能都会来自 pwntools,例如:
process()
remote()
p32() / p64()
asm()
shellcraft
ELF()
ROP()
所以它基本会贯穿整个 PWN 学习过程。
GDB与调试插件
GDB(GNU Debugger)是 GNU 提供的调试器,也是 PWN 和二进制程序调试中最常用的工具之一。
安装:
sudo apt-get update
sudo apt-get install gdb
直接输入:
gdb
即可进入。
不过原生 GDB 在做漏洞利用时并不是特别方便,所以一般还会搭配一个增强插件,常见的有:
pwndbg
GEF
两者功能有很多重合,没有必要全部安装,选择自己习惯的一个即可。
我最后选择 pwndbg,单纯觉得比较好看。
pwndbg
pwndbg 面向漏洞利用和逆向分析,可以在调试过程中直接显示寄存器、栈、反汇编代码以及内存信息。
安装:
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh
安装完成以后重新打开 GDB。
如果想检查 GDB 当前加载了哪些配置,可以查看:
cat ~/.gdbinit
如果之前没有安装其他插件,一般只会看到 pwndbg 对应的加载配置;如果以前安装过其他 GDB 插件,也可以把不需要的配置注释掉,避免多个插件之间互相影响。
GEF
GEF(GDB Enhanced Features)同样是一个针对 GDB 的增强插件,主要用于 Linux 下的漏洞利用、逆向分析和程序调试。
可以从 GitHub 获取:
git clone https://github.com/hugsy/gef.git ~/gef
然后在 .gdbinit 中加载:
echo "source ~/gef/gef.py" >> ~/.gdbinit
再检查:
cat ~/.gdbinit
这里需要注意路径格式。
错误示例:
source "~/gef/gef.py"
正确示例:
source ~/gef/gef.py
如果遇到 GDB 自动加载相关的安全限制,也可以根据具体情况修改:
set auto-load safe-path /
GEF 和 pwndbg 的定位基本类似,所以一般二选一即可。
IDA Pro
IDA Pro,全称 Interactive Disassembler Professional,是一款交互式反汇编工具。
对于逆向工程和漏洞分析来说,IDA 基本属于最常用的静态分析工具之一,可以处理包括:
Intel x86
x86-64
ARM
MIPS
PowerPC
68000
Z80
8051
等多种处理器架构。
它不仅可以查看反汇编,还能够通过函数识别、交叉引用、图形化控制流等方式帮助理解程序结构。
PWN 中经常会形成这样一种配合:
IDA
↓
静态分析程序结构
GDB
↓
动态确认程序真实运行状态
也就是先在 IDA 中找到关键函数、输入点和可能存在的漏洞,再进入 GDB 观察寄存器、栈和内存到底发生了什么。
目前使用 IDA Pro 6.8 即可。
几个常用辅助工具
除了 pwntools、GDB 和 IDA 之外,还有几个工具在做 PWN 时会经常出现。
cyclic
cyclic 是 pwntools 自带的工具,主要用来确定缓冲区溢出时的偏移。
例如:
cyclic 200
可以生成一段具有特殊规律的数据。
程序崩溃以后,根据覆盖到寄存器中的值,再使用:
cyclic -l 0x6161616c
就可以计算这个值在 cyclic 数据中的位置,从而得到:
buffer
↓
return address
之间的 offset。
这样通常比手工数缓冲区长度方便很多。
checksec
checksec 用于检查 ELF 程序开启了哪些安全保护,例如:
RELRO
Stack Canary
NX
PIE
安装:
sudo apt-get install checksec
使用:
checksec --file=/usr/bin/ls
输出可能类似:
RELRO STACK CANARY NX PIE
Partial RELRO No canary found NX enabled No PIE
做一道 PWN 题之前,先看一次 checksec 通常很有用,因为不同保护机制会直接影响后面的利用思路。
例如:
NX
↓
影响能不能直接执行 shellcode
Canary
↓
影响能不能直接覆盖栈
PIE
↓
影响程序代码地址是否固定
RELRO
↓
影响 GOT 等区域的可写性
后面真正做题时,这几个名字会不断出现。
ROPgadget
ROPgadget 用于搜索二进制程序中已经存在的 ROP gadgets。
ROP,也就是 Return-Oriented Programming,本质上会利用程序本身已有的短指令序列重新组织执行流程,因此需要经常搜索类似:
pop rdi
ret
这样的代码片段。
安装:
git clone https://github.com/JonathanSalwan/ROPgadget.git
cd ROPgadget
sudo python setup.py install
之后可以:
ROPgadget --binary ./test
查看程序中的 gadgets。
例如:
ROPgadget --binary ./test | grep "pop rdi"
就可以专门寻找包含 pop rdi 的指令序列。
基本环境到这里就够了
最开始学习 PWN,并不需要把所有逆向和漏洞利用工具一次装齐。
先准备好:
pwntools
↓
写 exploit、连接程序、构造数据
GDB + pwndbg / GEF
↓
动态调试、观察寄存器和栈
IDA Pro
↓
静态分析程序逻辑
cyclic
↓
计算溢出偏移
checksec
↓
观察程序保护
ROPgadget
↓
搜索可利用指令
基本就已经能够开始做最基础的:
栈溢出
ret2text
ret2shellcode
ROP
后面随着题目变复杂,再根据实际需要补充其他工具即可。
环境配置本身不是 PWN 最难的部分,真正重要的是知道:
每一个工具到底在帮自己解决什么问题。
工具只是把程序的状态展示出来,最后真正需要理解的仍然是:
程序怎样运行
内存怎样变化
返回地址在哪里
寄存器发生了什么
漏洞为什么能够成立
这部分是后来重新整理时补出来的完整结构。原来的内容没有这么整齐,也没有这么多解释。















这一切,似未曾拥有