你首先需要的是 Linux Shell ,因为大多数 pwn 挑战通常是 64 位 ELF 可执行文件 。我会写两个不同的部分,分别针对 Windows 和 MacOS。如果你已经用过任何 Linux 发行 版,这部分你就没问题了!对于剩下的 Windows/MacOS 用户,我强烈建议安装 Debian Bookworm 作为首选发行版,因为它目前使用 glibc 2.36,尚未实现完整的 RELRO, 且利用起来稍微容易一些。
Windows
对于正在阅读本文的 Windows 用户,你可以按照链接的说明书轻松下载 WSL。如果你懒得看,这里有一份你应该执行的命令列表。
安装使用 Debian for WSL
arduino
wsl.exe --update
wsl --set-default-version 2
wsl install -d Debian
就是这样!从现在起,你可以通过开始菜单 中的 Debian 搜索 Debian,或者在命令行中运行 Debian,进入你的 Debian shell 。关于上述 WSL 2 的要求,WSL 2 允许你在 WSL 内部的集成桌面模式下使用 GUI 应用。这其实没什么特别的意义,除了你可以让你的调试器在一个新窗口里弹出,不用 tmux,这对我来说简直是个大胜利!!
补充一点,你可能需要更新系统包 ,并下载文本编辑器,以避免在 WSL 终端和其他窗口之间切换。你可以用以下命令完成: sudo apt update && sudo apt dist-upgrade && sudo apt(-get) install <editor of choice> 。
如果你想要完全懒散的体验和最少的 Linux shell 作,你可以挂载你的 Windows 文件系统 ,并在 Downloads 目录中使用以下命令(不区分大小写!): cd /mnt/c/users/your\ name/downloads
macOS
不幸的是,对于 MacOS 用户来说,我觉得没有像 Windows 用户那样的集成桌面。所以,我建议你按照这个指南作,尽可能多地在终端里作 ,你会在其中花费比预期更多的时间。好消息是,有 Lima ,我们可以用它帮助简化创建 x64 Linux 壳,即使是在 Apple Silicon 上。
这里有一份快速入门的推荐清单。
arduino
brew install lima
limactl start --name=x64-debian template://debian --arch=x86_64
limactl shell x64-debian
sudo apt install tmux
你会 遇到终端颜色的问题,解决方案完全取决于你的终端模拟器 ,所以你自己找解决方案。
额外加分:可写主机文件系统!
LiMactl 编辑 x64-debian 以编辑配置 添加以下不安全的配置:
yaml
mounts:
- location: "~"
writable: true
现在你拥有了一个运行在 x64 上的 Linux Shell ,可以不受限制地访问你的主机文件系统! 你可以用标签自动补全你的虚拟机名字拼写!
恭喜你通过了 Linux 安装!繁琐的部分现在开始了......我们先着手安装调试器和基础工具。
工具安装
恭喜你完成了Linux安装!乏味的部分现在开始了...让我们先安装调试器和基本工具。
实用工具
pwntools
sudo apt install python3安装pythonsudo apt-get install python3-pwntools安装pwntoolspwn checksec /lib/x86_64-linux-gnu/libc.so.6验证它是否工作
one gadget
sudo apt install rubygems安装gemgem install one_gadget安装one gadgetone_gadget /lib/x86_64-linux-gnu/libc.so.6验证它是否工作
rop gadget
sudo -H python3 -m pip install ROPgadget安装ROPgadgetROPgadget /lib/x86_64-linux-gnu/libc.so.6验证它是否工作(警告:输出量很大!!)
调试器
我强烈推荐bata-gef,你也应该使用它!
我不建议盲目运行安装脚本。相反,克隆仓库 并在你的.gdbinit中source它的gef.py。
bash
cd ~
git clone https://github.com/bata24/gef
vi ~/.gdbinit
#.gdbinit
source /path/to/gef.py
对于没有集成桌面模式的MacOS用户,使用我们之前安装的tmux。只需运行以下命令:
tmux启动tmux[Ctrl] + B进入命令模式]启用滚动[Ctrl] + C重置状态[Ctrl] + B,然后<arrow>切换焦点标签页
反编译器/反汇编器
太好了!现在我们有了开始编写和调试_pwn_脚本所需的一切,这技术上 就是我们需要的全部,但有时,挑战不提供源代码 。在这种情况下,需要进行一些逆向工程工作 。让我们下载**Ghidra**。
设置相当简单,你只需要一个Java运行时 ,我推荐Temurin,你可以在
这里 找到它。
一旦你安装了运行时,只需运行ghidraRun或ghidraRun.bat来启动Ghidra。
使用Ghidra
Ghidra实际上相当不错且用户友好,你所要做的就是创建一个空项目 ,然后拖放你的挑战二进制文件到其中,并给它一点时间来生成反汇编和反编译!
容器化和服务器复制
恭喜你走到这一步!你已经准备好处理几乎所有pwn挑战了。然而,我们可以做得更好。
有时,善意的挑战作者会提供libc、ld和/或Dockerfile 。这些文件特别有用,因为它们帮助你确保你的挑战使用与服务器相同的库,确保你永远不会遇到_"在我的机器上可以运行"_的问题!所以,我将介绍如何处理这些文件的各种组合。
给定了Libc、ld和Dockerfile
这是最好的情况,因为你不需要做太多。这里有一个你可以运行的命令来使用给定的libc和ld:
./ld-linux-x86-64.so.2 --library-path . ./chal
这将运行链接器 ,并告诉它使用你目录中的库 来启动挑战。就这样! 你现在正在使用给定的库。但是,我们如何复制服务器呢?
首先,我们必须安装Docker。过程相当长,但请相信
文档 并遵循它。
一旦你安装了Docker,你所要做的就是运行以下命令:
docker run -p YOUR_PORT:CONTAINER_PORT -d --privileged $(docker build -q .)
这将构建容器,然后以特权 运行它,这通常是_pwn.red/jail_模板所需要的。请将CONTAINER_PORT占位符替换为容器提供挑战的端口,将YOUR_PORT替换为宿主机上的任何未使用端口。默认情况下,这将绑定到所有接口。
设置完成后,你可以像这样连接到容器并运行挑战:
nc 127.0.0.1 YOUR_PORT
就这样!你已经成功复制了服务器使用的库,以及服务器本身!完成后,你应该通过运行docker ps找到容器哈希,然后运行docker stop <hash>来清理正在运行的容器。
只提供了Dockerfile
有时,作者只提供Dockerfile。这很糟糕,但没关系,因为我们可以自己提取libc和ld。我们首先使用上述步骤启动容器,然后执行以下操作:
bash
docker cp 1a2b:/lib/x86_64-linux-gnu/libc.so.6 ./libc.so.6
docker cp 1a2b:/lib/x86_64-linux-gnu/ld-linux-x86-64 ./ld-linux-x86-64.so.2
记得将1a2b替换为容器哈希的前4个字符 ,启动时会显示给你。有时,Dockerfile 会从另一个Linux发行版 复制文件到一个文件夹来提供服务,以便使用该发行版的libc。在这种情况下,只需在路径前加上前缀。使用一个容器执行COPY --from=debian:bookworm / /srv的例子,我们只需在/lib前加上/srv来从服务器的文件中复制。
结论
通过以上所有设置和安装,你应该拥有所有工具,以及开始处理pwn挑战的基本知识。快乐pwning! 如果你现在想了解更多关于pwn的一般知识,请阅读我的博客文章