前言
工欲善其事,必先利其器。搭建一個良好的 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
