前言
工欲善其事,必先利其器。搭建一个良好的 pwn 环境能使 pwn 学习事半功倍。本篇文章介绍下使用 wsl2 搭建 pwn 环境的过程,使用 vmware 搭建 linux pwn 环境过程也是类似的,本文可以供作参考。
windows 下的工具
wsl2
wsl 全称 Windows Subsystem for Linux。但是 wsl 与传统虚拟机相比,没有虚拟硬件的过程,而是在 windows 上虚拟一个 linux 内核,模拟 linux 调用。它的底层实现还是 windows ,所以只能用作轻量开发,很多 linux 的功能不能实现。而 wsl2 是使用最新、最强大的虚拟化技术在轻量级实用工具虚拟机 (VM) 中运行 Linux 内核,是跑在虚拟机中的完整 linux ,基本实现了 linux 的功能,并且可以兼容 docker 以及 vmware 。相比于 vmware 虚拟机 ,wsl 能够快速启动以及有着与 windows 良好的交互体验,所以萌生了使用 wsl2 搭建 pwn 环境的想法。
本文搭建的是 ubuntu16 ,因我原来 vmware 使用的就是 ub16 ,以及其兼容性较好。不过 ub16 现已经停止维护,所以可以考虑更新的版本。
wsl2-官方手册
Windows Terminal
windows 终端功能十分丰富,这里就不过多介绍了。我使用它的主要目的是为了美化终端,毕竟好看就是生产力。
效果如下图:
vscode
vscode 有 remote wsl 插件,可以很方便在 wsl 上使用。 vscode 我就主要用来在 linux 上写写 python 脚本,写项目的话还是推荐 visual studio 跟 Jetbrains 全家桶这类 IDE。
安装 remote wsl 插件后,在 wsl2 中键入 code .,即可打开 vscode 。
IDA Pro
IDA Pro 就不用过多介绍了,二进制玩家人手必备的反编译利器。
原来的白底看久了太刺眼,推荐一个 ida 配色插件。
IDASkins-github
效果如下:
docker
docker 可以很方便的构建容器,可以理解为一个非常轻量级的虚拟机。
我使用的是 docker-desktop ,在 设置->Resources->WSL INTEGRATION 勾选对应的 Ubantu 版本即可在 wsl2 中使用 docker 。
docker-desktop
linux ubuntu16 配置
32位环境
wsl2 的默认是 64 位环境,并不兼容 32 位,所以要先配置 32 位环境。
sudo dpkg --add-architecture i386
sudo apt-get update
// install build tools
sudo apt install build-essential
sudo apt install gcc-multilib
pwntools
Pwntools 是 CTF 框架和开发库。它以 Python 编写,专为快速原型设计和开发而设计,旨在使漏洞利用编写尽可能简单。
pwntools-github
python2
sudo apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential
sudo pip install --upgrade pip
sudo pip install --upgrade pwntools
sudo apt-get install python-dev
python3
sudo apt-get update
sudo apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
sudo python3 -m pip install --upgrade pip
sudo python3 -m pip install --upgrade pwntools
以上命令安装 pwntools 同时也配置了 pwntools 所需的 python 环境,安装完成后我们可以使用 asm 测试一下是否成功。
pwndbg
pwndbg 是一个 GDB 插件,它使使用 GDB 进行调试的工作量减少了,并将重点放在低级软件开发人员,硬件黑客,逆向工程人员和利用开发人员所需的功能上。
pwndbg-github
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh
当然常用的功能类似的插件还有gdbpeda-github,两个插件我都有使用过,命令和功能都差不多,现在我更倾向于使用 pwndbg 。需要注意是这两个插件不能同时在 gdb 中兼容,可以通过编辑 .gdbinit 文件来切换插件。
pwngdb
也是 GDB 的插件,提供许多命令,能够使你在动态调试的过程中更好查看内存的各种信息。
pwngdb-github
cd ~/
git clone https://github.com/scwuaptx/Pwngdb.git
cp ~/Pwngdb/.gdbinit ~/
.gdbinit 配置文件如下:
source /home/pwnki/pwndbg/gdbinit.py
#source ~/peda/peda.py //使用 pwndbg 就要把 peda 注释掉,反过来也一样
source ~/Pwngdb/pwngdb.py
source ~/Pwngdb/angelheap/gdbinit.py
define hook-run
python
import angelheap
angelheap.init_angelheap()
end
end
glibc-all-in-one
可以下载各个版本带有 debug 文件的 glibc ,方便不同 glibc 下的本地调试。
glibc-all-in-one_github
git clone https://github.com/matrix1001/glibc-all-in-one.git
里面提供了下载脚本,具体使用请参考官方手册。
pwn_debug
提供在本机中调试代码在不同 glibc 环境下的功能。ubantu16 对应的 glibc 2.23 ,ubantu18 对应的 glibc 2.27 ,以及更高版的 ubantu 对应 glibc 2.30 、glibc 2.31 等等。不同的 glibc 的源码不同,漏洞不同,也就导致 getshell 的方法不尽相同,所以多个 glibc 环境是刚需。而 pwn_debug 使得我们不需要配置多个 ubantu ,只需要一个 ubantu ,配合上 glibc-all-in-one 里下载个各种带编译符号的 glibc ,就能调试 多个 glibc 环境的代码,非常实用。当然这不是唯一的解决方案,patchelf 等也能解决这一问题。
pwn_debug-github
git clone https://github.com/ray-cp/pwn_debug.git
cd pwn_debug
sudo python setup.py install
如何切换 glibc 环境,请参考官方手册。
seccomp-tools
这个工具主要用来分析 seccomp 沙盒题的,能够查询程序禁用哪些系统调用。
seccomp-tools 需要 ruby 环境,一开始用 rvm 装 ruby 老是遇到版本问题,后来直接卸载了 rvm 上ruby官网下载源码自己编译安装,成功解决问题。
ruby 安装
tar -zxvf ruby-3.0.0.tar
cd ruby-3.0.0
sudo ./configure
sudo make
sudo make install
sudo gem install seccomp-tools
one_gadget
one_gadget 工具主要用来找 libc 中的 shellcode 地址。将返回地址置为这个 shellcode 地址,或者覆盖堆机制中的指针为 shellcode 地址并引用指针,就可以 getshell 。
one_gadget-github
sudo gem install one_gadget
LibcSearcher
用于搜索 libc 的偏移。每个 pwn 题的远程环境是不一样的, libc 也就不一样,当我们泄露了 libc 地址后,通过 LibcSearcher 就能获得这个 libc 中函数的偏移。
LibcSearcher-github
git clone https://github.com/lieanu/LibcSearcher.git
cd LibcSearcher
sudo python setup.py develop
ctf_xinetd
这个工具使用 docker 来部署 pwn 环境。可以用来搭建 pwn 题。
ctf_xinetd-github
git clone https://github.com/Eadom/ctf_xinetd.git