【免费下载链接】pwntools
CTF framework and exploit development library
本篇技术指南以仓库根目录的 DOCKER.md 为核心,系统讲解如何通过官方 Docker 镜像快速获得开箱即用的 Pwntools 开发环境:从一条命令拉取运行 stable 镜像、配置调试所需的特权与网络参数,到通过 bind mount 在宿主机与容器之间共享代码目录,并进一步结合 extra/docker 目录下的源码,说明 base/stable/beta/dev/develop 镜像家族的构建层次与原理。读完本文,你将掌握用 Docker 在任意 Linux/macOS/Windows 主机上搭建、运行和调试 Pwntools 的完整实战方案。
为什么用 Docker 运行 Pwntools
在本地工作站上安装 Pwntools 经常是一件麻烦事:需要处理 pip 依赖、交叉编译工具链(binutils)、QEMU 用户态模拟、GDB 调试器等一堆系统级组件,还要保证它们之间的版本兼容。正如 DOCKER.md 开篇所述,你想要的是一套"开箱即用"(Just Works)的环境。
Docker 恰好解决了这个问题:镜像内部是一个标准化的 Linux 环境,Pwntools 及其全部依赖已被预先安装完毕,你不需要操心 pip 或安装依赖,拉取镜像即可开始工作。对于 CTF 比赛、漏洞利用脚本编写、二进制分析等场景,这意味着从"配置环境"到"写 exploit"的启动时间被压缩到一条命令。
快速开始:拉取并运行 stable 镜像
首先,请为你的操作系统安装 Docker,官方提供各平台的 Getting Started 指引。
安装完成后,下载并运行 Pwntools 的稳定版(stable)镜像:
$ docker run -it pwntools/pwntools:stable
-it 表示以交互模式启动并分配伪终端,命令执行后你会直接进入容器内的 shell。此时 pwn 命令行工具与 python3 环境都已就绪,可以立即开始使用:
$ pwn version
$ python3 -c "from pwn import *; print(ELF('/bin/ls'))"
从 extra/docker/README.md 可以看到,镜像同样可以从 Docker Hub 显式拉取:
$ docker pull pwntools/pwntools:stable
将标签 stable 替换为 beta 或 dev 即可拉取对应版本(各标签的含义见下文"镜像家族与标签体系"一节)。
推荐运行参数:让调试与网络真正可用
仅仅 docker run -it 启动的容器对二进制调试来说还不够——默认情况下容器内进程受到隔离限制,无法使用 GDB 跟踪调试(ptrace 受限),也无法生成 core dump 文件。为了让镜像发挥最大能力,我们需要启用进程调试(--privileged)、把宿主机的网络端口暴露给容器(--net=host),并放宽资源限制:
$ docker run -it \
--privileged \
--net=host \
--hostname localhost \
--ulimit core=-1:-1 \
pwntools/pwntools:stable
各参数的作用如下:
| 参数 | 作用 |
|---|---|
--privileged | 赋予容器特权模式,允许对进程进行 GDB 级别的调试(ptrace 等操作) |
--net=host | 容器直接复用宿主机网络栈,方便从容器外连接容器内监听的端口,也便于容器内连接宿主机上的服务 |
--hostname localhost | 将容器主机名设为 localhost,避免某些工具因主机名解析产生干扰 |
--ulimit core=-1:-1 | 放开 core dump 的大小限制(无限),使程序崩溃时能正常生成 core 文件,配合 Corefile 类做崩溃分析 |
其中 --privileged 与 --ulimit 的用途在 extra/docker/README.md 中有明确说明:特权模式是使用 GDB 调试所必需的,而放开 ulimit 是为了让程序崩溃时能成功落盘 core 文件;--net=host 则让你能方便地在容器内外互相连接服务。
与宿主机共享目录:bind mount 绑定挂载
实际开发中,你通常希望用宿主机上习惯的编辑器(VSCode、Vim 等)编写代码,同时让改动实时出现在容器内执行。借助 Docker 的 bind mount(--mount type=bind)可以轻松实现这一点。
下面的命令会把宿主机的 ~/exploits 目录挂载进容器,出现在 /home/pwntools/exploits,从而实现在容器外编辑、在容器内运行的开发流:
$ mkdir $HOME/exploits
$ vim $HOME/exploits/my_exploit.py
$ docker run -it \
--privileged \
--net=host \
--hostname localhost \
--ulimit core=-1:-1 \
--mount type=bind,source="$HOME/exploits",target=/home/pwntools/exploits \
pwntools/pwntools:stable
$ python3 exploits/my_exploit.py
注意挂载目标路径 /home/pwntools/exploits 位于镜像默认用户 pwntools 的主目录下。从 extra/docker/base/Dockerfile 的构建过程可以看到,基础镜像会创建名为 pwntools 的非 root 用户并以其身份运行,因此把共享目录挂载到该用户的 home 下可以避免权限问题。
Windows 用户绑定挂载
Windows 上不存在 $HOME 环境变量,对应的变量是 %UserProfile%。假设你在 Windows 上使用 Visual Studio Code 且 code.exe 已在 %PATH% 中,等价命令如下:
C:\Users\user> mkdir Desktop\exploits
C:\Users\user> code Desktop\exploits\my_exploit.py
C:\Users\user> docker run -it \
--privileged \
--net=host \
--hostname localhost \
--ulimit core=-1:-1 \
--mount type=bind,source="%UserProfile%\Desktop\exploits",target=/home/pwntools/exploits \
pwntools/pwntools:stable
$ python3 exploits/my_exploit.py
核心差异只有两点:source 使用 %UserProfile%\Desktop\exploits 而不是 $HOME/exploits;其余调试参数与挂载目标完全一致。
镜像家族与标签体系
仓库 extra/docker 目录下维护了多套 Dockerfile,它们通过 FROM 指令构成一条清晰的继承链:
ubuntu:noble (基础系统)
└── pwntools/pwntools:base
├── pwntools/pwntools:stable ──> beta ──> dev
└── pwntools/pwntools:develop(开发专用,基于 base)
各标签对应源码如下:
- base:extra/docker/base/Dockerfile —— 一切镜像的根基,基于
ubuntu:noble,负责安装系统依赖与 Pwntools 本体; - stable:extra/docker/stable/Dockerfile —— 在 base 之上把 Pwntools 切换为
stable分支(git 安装方式)并执行pwn update; - beta:extra/docker/beta/Dockerfile —— 在 stable 之上把 Pwntools 切换为
beta分支; - dev:extra/docker/dev/Dockerfile —— 在 stable 之上把 Pwntools 切换为
dev分支,即跟随最新开发进展的每日构建版本; - develop:extra/docker/develop/Dockerfile —— 面向 Pwntools 自身开发者的镜像,采用可编辑安装(
--editable)并把宿主机的仓库目录挂载进容器。
dev 采用链式升级而非直接从 base 构建,这一点从 extra/docker/dev/Dockerfile 的 FROM pwntools/pwntools:stable 可以印证:dev 镜像基于 stable,再用 pip install git+...@dev 覆盖安装 dev 分支代码,最后执行 PWNLIB_NOTERM=1 pwn update 更新系统工具与数据。
base 镜像的构建内容
从源码看,extra/docker/base/Dockerfile 是理解整个镜像生态的关键,它主要完成以下工作:
- 系统层:基于
ubuntu:noble,安装sudo、build-essential、git、python3/python3-pip、elfutils、libssl-dev、libffi-dev等构建与运行依赖; - 跨架构工具链:为 CTF 中常见的二进制架构一次性装齐 GNU binutils,包括 arm、aarch64、mips/mipsel、msp430、powerpc/powerpc64、s390x、sparc64、riscv64、loongarch64 等(这也是 Pwntools 汇编/反汇编支持多架构的基础);
- 仿真支持:安装
qemu-user-static,配合binfmt可在 x86 宿主机上直接运行其他架构的程序,这一点与 pwnlib/qemu.py 中的 QEMU 封装配合使用; - 辅助工具:
tmux(配合 gdb 调试会话)、patchelf(修改 ELF 动态链接器); - 用户与权限:删除默认 ubuntu 用户,创建
pwntools用户,删除其密码(passwd --delete --unlock)并配置免密 sudo(NOPASSWD),镜像默认以该用户身份运行; - Pwntools 本体:通过
pip install --break-system-packages --upgrade pwntools安装,随后执行PWNLIB_NOTERM=1 pwn update拉取最新的用户代理数据与常量定义。
本地构建与运行:一行 Makefile 搞定
除了从 Docker Hub 拉取,你也可以在本地从源码构建镜像。extra/docker/Makefile 提供了便捷入口:
$ make -C extra/docker dev
该命令会在 extra/docker/dev/ 目录下执行 docker build -t pwntools/pwntools:dev。Makefile 中定义了标签集合 tags=base stable beta dev,也支持逐个构建:
$ make -C extra/docker base
$ make -C extra/docker stable
运行任意镜像的推荐命令(以 dev 为例)与 DOCKER.md 中的推荐参数一致:
$ docker run -it \
--privileged \
--net=host \
--ulimit core=-1:-1 \
pwntools/pwntools:dev
Makefile 中还定义了一个特殊目标 develop,它会以 --mount type=bind 把当前 git 仓库根目录(ROOT,通过 git rev-parse --show-toplevel 获取)挂载到容器内的 /home/pwntools/pwntools,并进入默认的 zsh shell;如果设置了 HISTFILE 环境变量,还会额外挂载 shell 历史文件以支持跨容器共享历史记录:
$ make -C extra/docker develop
develop 镜像:在容器内开发 Pwntools 本身
对于想为 Pwntools 贡献代码的开发者,extra/docker/develop/Dockerfile 提供了一套完整的容器内开发环境,其关键设计如下:
- 可编辑安装:克隆仓库后以
python3 -m pip install --editable pwntools方式安装,配合宿主机目录的 bind mount,本地代码改动即时生效,无需重新构建镜像; - PATH 调整:由于 Pwntools 不再系统级安装,其
pwn等命令行入口位于~/.local/bin,Dockerfile 通过ENV PATH="/home/pwntools/.local/bin:${PATH}"将其加入搜索路径; - 调试工具链:安装
gdb、gdbserver、gdb-multiarch、tmux,并克隆安装 pwndbg 中的对应RUN步骤); - zsh + prezto:默认 shell 切换为 zsh 并安装 prezto 框架,同时把仓库中的 extra/zsh_completion/_pwn 符号链接到 zsh 补全目录,获得
pwn命令的自动补全; - IPython 自动导入:通过 extra/docker/develop/10-import.py(内容为
from pwn import *及常用标准库导入)和 extra/docker/develop/ipython_config.py 配置 IPython 启动脚本,进入解释器即自动具备pwn命名空间; - qemu-binfmt 映射:建立
/etc/qemu-binfmt下 arm/aarch64/mips/mipsel/powerpc/powerpc64/sparc64/riscv64/loongarch64 的符号链接,让容器可以跨架构运行并调试程序。
这套 develop 环境的测试延伸位于 travis/docker 目录:其 Makefile 通过拼接 develop Dockerfile 与 Dockerfile.travis 生成 CI 用镜像,并提供 doctest3 目标在容器内运行 Pwntools 的文档测试(doctest)。这也从侧面印证了 DOCKER.md 推荐参数中 --privileged、--net=host、--ulimit core=-1:-1 等选项在官方 CI/开发流程中的通用性。
小结
使用 Docker 运行 Pwntools 的最大价值在于"环境即镜像":依赖、工具链、调试器一次构建,处处复用。日常使用只需记住三条命令模式:
- 快速启动:
docker run -it pwntools/pwntools:stable - 完整调试能力:追加
--privileged --net=host --hostname localhost --ulimit core=-1:-1 - 共享代码目录:追加
--mount type=bind,source="$HOME/exploits",target=/home/pwntools/exploits(Windows 下把$HOME换成%UserProfile%)
如需进一步研究镜像的构建细节、自行定制或参与开发,可以继续阅读仓库中的 extra/docker/README.md、extra/docker/Makefile 以及 extra/docker/base/Dockerfile 等源码文件。
【免费下载链接】pwntools
CTF framework and exploit development library
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



