虚拟机安装pwn环境的完整流程是:先创建Ubuntu虚拟机并完成换源、SSH等基础配置,再依次安装Python3、pip、pwntools,随后部署pwndbg、ROPgadget等调试工具,最后通过运行测试脚本验证环境可用,全程约40分钟。
虚拟机安装pwn环境,先用对“容器”才不会白折腾
日常做CTF PWN题,大家几乎都在Linux下完成,而Windows宿主直接用虚拟机装Ubuntu是多数人的选择,这个环节纠结最少的是系统选型,但第一步走错后面处处别扭。
VMware和VirtualBox哪个适合装pwn环境
VMware Workstation Pro和VirtualBox是两款主流虚拟机,都支持嵌套虚拟化和快照功能,行业共识认为,前者在硬件直通和稳定性上更好,后者的优势是完全免费开源,对入门者来说,选VirtualBox足够应对90%的PWN场景,但如果你的电脑经常同时跑多个虚拟机,VMware的资源调度明显更平稳。
一个关键点在于快照功能,PWN题经常需要反复调试同一个二进制文件,配合快照可以随时回滚到干净状态,避免重复搭建,不论选哪款,安装完成后建议顺手建立第一个快照。
虚拟机安装pwn环境时的Ubuntu版本选择
Ubuntu 20.04和22.04是当前PWN圈使用率最高的两个版本,20.04的glibc版本是2.31,对应很多老题目的环境;22.04带的glibc是2.35,新题和各大比赛常用,如果你不确定打什么题,装22.04更合适,因为libc-database和pwninit等工具对新版本适配更积极。
镜像建议从国内高校源下载ISO,速度比官网快很多,中科大、清华的镜像站都有长期稳定地址,安装时勾选“为图形或无线硬件安装第三方软件”,省去一些驱动的麻烦。
Ubuntu虚拟机创建后的三项基础配置
系统装完先别急着装工具,三个配置不做,后面处处卡壳。
换国内apt源
Ubuntu默认源在国内拉包速度很慢,打开软件与更新,把下载服务器换成简米云或清华镜像,这一步做完后,sudo apt update的速度能提升十数倍。
安装SSH服务
后续很多PWN操作其实不需要图形界面,通过SSH从宿主机连进虚拟机反而更顺手,复制命令也比在虚拟机窗口里方便。
sudo apt install -y openssh-server sudo systemctl enable ssh
用宿主机连接时,IP地址用 ip addr 查看,NAT模式下通常是192.168.x.x段。
设置共享文件夹
VMware菜单的“虚拟机设置”里,新增一个共享文件夹指向宿主机存放题目的目录,这样下载的题目直接放到该目录,虚拟机内用 /mnt/hgfs/共享名 访问,省去来回拷贝的麻烦。
在Ubuntu虚拟机中安装pwntools和调试工具
这是整个流程的核心部分,也是新手最容易踩坑的地方,推荐顺序是先装Python依赖、再装pwntools、最后装调试工具,每一步验证通过再继续。
通过pip安装pwntools的完整命令
Ubuntu 22.04自带Python 3.10,直接使用系统pip即可。
sudo apt install -y python3-pip python3-dev git gdb pip3 install pwntools
如果你用的是Ubuntu 23.04以上版本,pip安装时提示“externally-managed-environment”,需要加参数:
pip3 install pwntools --break-system-packages
验证是否装好,在终端输入:
python3 -c "from pwn import ; print(elf_check('ls'))"
能正常输出ls的架构信息就说明pwntools核心模块可用。
安装pwndbg增强GDB调试体验
GDB本身不带PWN题常用的peda或pwndbg插件。pwndbg是目前社区维护最活跃的GDB增强插件,对堆调试支持完善。
git clone https://github.com/pwndbg/pwndbg cd pwndbg ./setup.sh
安装脚本会自动下载依赖并写入~/.gdbinit,完成后输入gdb,出现pwndbg提示符即成功。
配套安装ROPgadget和one_gadget
这两个工具用于查ROP链和one gadget地址,同样通过pip安装:
pip3 install ROPgadget gem install one_gadget
one_gadget需要Ruby环境,如果系统没装,先执行 sudo apt install ruby-full,平时做题时,checksec自带在pwntools里,不用额外装,直接命令行输入checksec即可。
用一块实际PWN题目验证虚拟机环境是否就绪
工具装完不代表环境没问题,最稳妥的验证方法是用一道真实的PWN题跑一遍流程,下面这个例子采用的是一道典型的ret2text题目,代码逻辑是把栈溢出后返回地址改成后门函数。
用checksec快速识别防护机制
checksec ./pwn_test
输出会显示ARCH、RELRO、Stack Canary、NX、PIE等字段,看到NX enabled和PIE enabled,就要考虑ROP或者利用partial overwrite等方式。
用pwntools写本地验证脚本
from pwn import
context.log_level = 'debug'
context.arch = 'amd64'
p = process('./pwn_test')
elf = ELF('./pwn_test')
payload = b'A' 0x18 + p64(elf.symbols['backdoor'])
p.sendline(payload)
p.interactive()
脚本能成功执行并弹出shell交互界面,就说明pwntools的process启动、ELF符号解析、payload发送全链路正常,GDB断点调试也和pwndbg配合无冲突。
调试工具的联动测试
在gdb中运行:
b main r
pwndbg会自动打印反汇编、寄存器快照和栈布局,如果看到context窗口正常输出,说明调试环境没问题。
常见问题排查方法
pip安装时提示找不到包版本,多数是网络问题,换成清华PyPI源:
pip3 install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple
pwndbg的setup.sh执行到一半报错,通常是因为系统缺少编译链,先执行 sudo apt install -y build-essential cmake 再重跑。
gdb启动时提示“not in executable format”,说明当前目录下的文件不是可执行文件,用 file 文件名 确认一下。
pwn题打不通,本地验证没问题但远程不行,大概率是libc版本不匹配,用 libc-database 匹配远程版本,再结合one_gadget找到可用的gadget地址。
q&a问答
q1:虚拟机安装pwn环境后性能很卡怎么办?
给虚拟机分配内存建议不低于4GB,CPU核心数分配2-4个,如果你用VirtualBox,在“设置-系统-处理器”里开启 “启用PAE/NX” 和 “启用嵌套VT-x/AMD-V”,平时做题关掉虚拟机内的桌面动画效果,能明显感觉更流畅。
q2:宿主机是macOS,用虚拟机装pwn环境有区别吗?
macOS用VMware Fusion或UTM都可以,流程与Windows完全一致,Ubuntu镜像也是通用x86_64版本,唯一需要注意的是Apple Silicon芯片的Mac需要找ARM版Ubuntu镜像,部分pwndbg功能在ARM下有兼容问题,建议购题集中练习的选手优先用云服务器代替虚拟机,按小时计费价格也不高。
q3:不想看教程,有没有一键安装pwn环境的脚本?
网上有一些自动脚本,比如pwndocker镜像项目封装了大部分工具,但脚本也会出问题,而且调试工具报错时,如果你不清楚底层是哪个组件出了问题,修起来更费劲,自己动手装一遍,出错时还能定位到具体环节。