1668 字
8 分钟
Kali-Linux Pwn 环境配置 - 工具安装
NOTE

Tips:

  1. 本教程于 2026.1 更新

    由于教程是在 WSL 子系统教程之后编写的,只作为针对新手的补充,后续可以参照子系统的教程,相对来说没有子系统的教程细致,但是更适合新手

  2. 本教程默认你有了基本的计算机操作水平并且已经解决了任何网络问题

  3. 由于网页和图床代理到 Cloudflare,如果你浏览有些卡顿甚至加载失败,请自行加速并刷新

1. Pwn 基础环境安装#

IMPORTANT
  • 确保你使用了 pyenvcondavenv 等虚拟环境
  • 或确保你可以使用 pipx 进行包管理
  • 或使用 apt 安装

1-1 安装 Pwntools#

Shell terminal
a
pip install pwntools
pipx install pwntools
sudo apt install python3-pwntools
uv pip install pwntools
python
from pwn import *

environment_linux-pwn_basictools-AF6CD915-ECCF-4A14-A2B2-CE848B051DCE

1-2 安装 GDB 以及 Pwndbg / GEF#

首先需要安装 GDB

Shell terminal
sudo apt install gdb gdbserver gdb-multiarch

在此基础上我们会安装 Pwndbg / Pwngdb /peda / gef事实上 Pwndbg 是目前最常用的,gef 的非官方一个版本也很厉害,他们可以满足大部分需求,对于入门师傅来说,peda 不推荐使用了

1-2-1 安装 Pwndbg#

TIP

一键安装的 Pwndbg 的 gdb 默认支持异架构,无需使用 multiarch 版本

项目链接:

Loading preview...
Waiting for metadata...

新版简化了安装流程,无需从源码安装,我们直接可以

Shell terminal
apt install xz-utils
curl -qsL 'https://install.pwndbg.re' | sh -s -- -t pwndbg-gdb

就安装好了,输入 pwndbg 即可使用

如果你想自定义安装位,你可以前往 Releases 下载压缩包解压到合适的位置

Shell terminal
apt install xz-utils
chmod 777 pwndbg_2025.05.30_x86_64-portable.tar.xz
tar -xvf pwndbg_2025.05.30_x86_64-portable.tar.xz

解压之后会有四个文件夹出现,我们可以将当前文件夹的 bin 目录添加到环境变量,也可以将文件夹下的 bin 里的可执行文件链接到系统的任意环境变量目录下,这里采用了后者

Shell terminal
sudo ln -s /path/to/pwndbg/bin/pwndbg /usr/bin/pwndbg

测试一下

environment_linux-pwn_basictools-1BA25DB1-62EA-495D-A2FB-072AA4906F78

1-2-2 集成 Pwngdb 与去重#

scwuaptx
/
Pwngdb
Waiting for api.github.com...
00K
0K
0K
Waiting...

在任意目录下克隆库

Shell terminal
git clone https://github.com/scwuaptx/Pwngdb.git

克隆之后你可以看到 angelheappwngdb.py

修改 Pwndbg 启动文件

Shell terminal
vim /path/to/pwndbg/bin/pwndbg

其中最后一行为

Shell terminal
exec "$dir/lib/ld-linux-x86-64.so.2" "$dir/exe/gdb" --quiet --early-init-eval-command="set auto-load safe-path /" --command=$dir/exe/gdbinit.py "$@"

添加刚才两文件路径

Shell terminal
exec "$dir/lib/ld-linux-x86-64.so.2" "$dir/exe/gdb" --quiet --early-init-eval-command="set auto-load safe-path /" --command=$dir/exe/gdbinit.py --command=/path/to/pwngdb.py --command=/path/to/angelheap/gdbinit.py "$@"

可以使用一些特殊的命令验证是否安装成功

environment_linux-pwn_basictools-C2C4E772-256B-499A-AF47-2D2EC1C63A1E

安装此插件会导致 Pwndbg 的 canary 以及 got 命令被替换,对于喜欢 pwndbg 的命令(或者是因为颜色)的人来说,你可以去搞一下这个

其实作者留下了一个兼容的脚本,就在 Pwngdb/pwndbg 中,不过由于更新问题兼容较为麻烦,这里我们有一种简单粗暴的方法

environment_linux-pwn_basictools-054D445A-816C-46D2-8D95-EAF161236EE7

environment_linux-pwn_basictools-6B991E21-1A9E-4F14-88F0-571EDB5F0FB6

我们直接找到 /path/to/Pwngdb/pwngdb.py 使用直接注释法,把上图两个位置的函数注释掉就行

效果对比

environment_linux-pwn_basictools-2F23ACD4-9B8F-4891-A435-FAE596EBA12F

environment_linux-pwn_basictools-A8242E22-38FC-49D1-B52D-C9BF9FA224B7

1-2-3 GEF 安装(可以用于内核 / 异架构)#

bata24
/
gef
Waiting for api.github.com...
00K
0K
0K
Waiting...

一键安装,但是安装到了并且只推荐以 root 身份安装

Shell terminal
wget -q https://raw.githubusercontent.com/bata24/gef/dev/install-uv.sh -O- | sudo sh

由于作者亲自说明是在 root 环境下测试,所以这里保持原位置

为了方便使用,可以:

Shell terminal
sudo vim /usr/bin/gef
/usr/bin/gdb
#!/bin/sh
sudo /usr/bin/gdb "$@"

然后赋予可执行权限

Shell terminal
sudo chmod 777 /usr/bin/gef

效果图

environment_linux-pwn_basictools-39259ACA-A9E8-442F-A039-755077471918

1-2-4 设置默认 GDB(可选)#

这个基于个人习惯,如果习惯默认使用 Pwndbg 而只想输入 的话可以改一下名字

Shell terminal
sudo mv /usr/bin/gdb /usr/bin/gdb-ori
sudo mv /usr/bin/pwndbg /usr/bin/gdb

如果更改的话记得上面的 GEF 脚本要更改对应 GDB 二进制文件为对应名称

Shell terminal
sudo vim /usr/bin/gef
/usr/bin/gef
#!/bin/sh
sudo /usr/bin/gdb-ori "$@"

如果是脚本里用可以指定

exp.py
context.gdb_binary = '/path/to/gdb'

1-3 安装其他小部件#

如果你使用了 venv 或者是 anconda / miniconda 记得一定要激活环境,若未指定,请根据当前的环境管理方式自行决定工具的安装方式

Shell terminal
conda activate <name>

1-3-1 ROPgadget 与 ropper#

用于搜寻在 ROP 攻击时使用的 gadget

Shell terminal
a
pip install ROPgadget
sudo apt install ropper

environment_linux-pwn_basictools-35FD84E0-0491-4942-B895-1D0C64AE3C35

environment_linux-pwn_basictools-C5C73197-5783-4913-AB49-CB22EED025B3

1-3-2 one_gadget#

用于在 libc 库中找到一个直接执行可以 getshell 的地址

Shell terminal
sudo apt install ruby ruby-dev gcc make
sudo gem install one_gadget

image-20260120103016556

1-3-3 seccomp-tools#

用于检测程序启用的沙箱保护

Shell terminal
sudo gem install seccomp-tools

environment_linux-pwn_basictools-B645A73D-D940-46E3-908A-BDCB0B808D87

1-3-4 patchelf 与 glibc-all-in-one#

由于题目在远程部署的环境和本地一定不相同,在某些对 libc 版本要求高的题目中需要更换指定的 libc

Shell terminal
pip install patchelf
git clone https://github.com/matrix1001/glibc-all-in-one.git

glibc-all-in-one 官方页面在:

matrix1001
/
glibc-all-in-one
Waiting for api.github.com...
00K
0K
0K
Waiting...

可以参考进行进一步下载不同版本 libc 的方式

Shell terminal
cd ./glibc-all-in-one
./update_list # 更新列表
cat list # 查看列表
./download <name> # 开始下载

在之后使用 patchelf 即可

Shell terminal
patchelf --set-interpreter <ld 位置> <文件位置>
patchelf --replace-needed <需替换的 libc 类型,例如 "libc.so.6"> <libc 位置> <文件位置>
或者
patchelf --set-rpath <'动态库文件夹位置1(必选):动态库文件夹位置1(可选):......'> <文件位置>

2. Pwn 特殊环境 - C++#

并非完全体,还在更新

当我们目光看向一道 C++ 的题目,正常的 C++ 题目都会提供下面这几样库文件,使用 patchelf 更改就行

environment_linux-pwn_basictools-2B6226E7-983B-48DC-B8B9-1E24164AF4DF

如果有些只给出了 libc.so.6 的话,你就需要手动下载其他的文件

2-1 下载对应发行版本的 libstdc++.so.6#

2-1-1 从 Docker / 对应 Linux 里扒#

很简单,如果题目给 Dockerfile 了,可以尝试部署题目的 Docker 环境,把用的库拷贝出来,使用 patchelf 或其他方式更改,如果没有就找 libc 或者是程序字符串寻找版本特征并从对应 Docker 或者 Linux 系统把缺的库扒出来

2-1-2 手动下载#

如果你发现 patch 完之后会说你的 libstdc++.so.6 需要更高版本,那么你可能需要更换一下这个库,一般来说这个东西不吃小版本,也没必要对应 Ubuntu 的版本下载了,直接前往 Debian 官网下载对应版就行

访问官网:

Loading preview...
Waiting for metadata...

点击下面有搜索,直接搜索

environment_linux-pwn_basictools-694EAB39-8BCE-4F9D-8544-2EC04CCCD7D7

你要找的就是下面这样的,叫做 libstdc++6-xx-dbg 的包

environment_linux-pwn_basictools-3ABEF675-34E0-4DA1-A277-530C29AD604D

如何确定你需要哪个?点进去看一眼版本

environment_linux-pwn_basictools-EF52C88E-CAA2-4103-B164-316F242E7B53

确认版本后就可以下载,如果程序需要的话,你可能还需要下载一个 libgcc_s.so.1

environment_linux-pwn_basictools-85B9302E-83FC-450F-8B68-82EFBB99D981

同时下面还有 dev 包供你选择,内含源码(可选,一般用不到)

environment_linux-pwn_basictools-76C54AF7-26D6-4889-B71B-35DA8EF3AFCD

2-2 替换程序使用的库#

经测试,libm.so.6 有一定概率无法使用 patchelf 的 --set-interpreter 进行修改,我们可以通过指定环境变量 LD_PRELOAD 来强制替换该库,它的位置和 libcld 坐一桌,正常运行只需要

Shell terminal
LD_PRELOAD=/path/to/target.so ./pwn
# 示例 LD_PRELOAD=./libm.so.6 ./pwn

如果你要引入多个,使用 : 隔开

Shell terminal
LD_PRELOAD=./libc.so.6:./libstdc++.so.6:./libm.so.6:./libgcc_s.so.1 ./pwn
Kali-Linux Pwn 环境配置 - 工具安装
https://fuwari.vercel.app/posts/environment_linux-pwn_basictools/
作者
Lufiende
发布于
2025-01-13
许可协议
CC BY-NC-SA 4.0