前言

由于目前互联网上关于 CTF PWN 环境搭建的教程并不是什么详细完整,作者因此也阅读了多篇 PWN 的搭建的文章,并在各位师傅的文章上进行总结完善,加以亲自操作验证写下了这篇笔记。如有不足之处,劳烦师傅们前往博客评论区留言补充~

系统安装

Ubuntu

请参考博客中关于 Ubuntu 安装教程的文章~

Kali Linux

请参考博客中关于 Kali Linux 安装教程的文章~

环境准备

基础工具

1
2
3
sudo apt install -y vim git gcc tree
sudo apt install -y gdb gdb-multiarch
sudo apt install -y "binfmt*"

安装 Python3

1
sudo apt install -y python3 python3-pip python3-dev

pip 换源

此方法仅适用 Linux 下换源,其他系统请手动创建配置文件换源!

1
2
pip config set global.index-url http://pypi.doubanio.com/simple/
pip config set install.trusted-host pypi.doubanio.com

安装 Python2

1
2
3
4
5
6
sudo apt install -y python2 python2-dev
# pip官方已不在支持python2,无法安装python-pip,可以通过bootstrap的pip2脚本进行安装
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py -O get-pip2.py
python2 get-pip2.py
rm -rf get-pip2.py
python2 -m pip install --upgrade pip==20.3.4

python-is-python3

1
sudo apt install -y python-is-python3

openssh-server

1
sudo apt install -y openssh-server

pwntools

Python3

1
2
3
4
sudo apt update
sudo apt install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pwntools

Python2

虽说 python2 用的不多了,但是还是建议安装一下,毕竟有时候可能还会用到~

1
2
3
4
5
6
7
sudo apt update
sudo apt install python2 python2-dev git libssl-dev libffi-dev build-essential
# pip官方已不在支持python2,可以使用bootstrap的pip2脚本进行安装
python2 -m pip install --upgrade pip==20.3.4
python2 -m pip install --upgrade pwntools
python2 -m pip install --upgrade pathlib2
python2 -m pip install --upgrade setuptools # Kali丢失,pwntools可能报错

验证 pwntools

1
2
3
4
5
6
7
8
root@Ubuntu:~# python2
Python 2.7.18 (default, Mar 8 2021, 13:02:45)
[GCC 9.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pwn
>>> pwn.asm("xor eax,eax")
'1\xc0'
>>>
1
2
3
4
5
6
7
8
root@Ubuntu:~# python3
Python 3.8.10 (default, Sep 28 2021, 16:10:42)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pwn import *
>>> asm("xor eax,eax")
b'1\xc0'
>>>

如果返回结果如上,则 pwntools 已经安装好了

GDB 插件

1
2
mkdir -p /opt/pwnenv/tools
cd /opt/pwnenv/tools

pwndbg

1
2
3
git clone https://github.com/pwndbg/pwndbg.git
cd pwndbg
./setup.sh && cd ..

peda

1
git clone https://github.com/longld/peda.git

gef

1
git clone https://github.com/hugsy/gef.git

peda-heap

1
git clone https://github.com/Mipu94/peda-heap.git

peda-arm

1
git clone https://github.com/alset0326/peda-arm.git

Pwngdb

1
git clone https://github.com/scwuaptx/Pwngdb.git

配置 gdbinit

先删除根目录下 pwndbg 生成的~/.gdbinit文件

1
rm -rf ~/.gdbinit

然后再使用下面的命令重新配置,不要一行一行使用,一起复制粘贴到终端,追加写入文件~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat >> ~/.gdbinit <<EOF
source /opt/pwnenv/tools/pwndbg/gdbinit.py
#source /opt/pwnenv/tools/peda/peda.py
#source /opt/pwnenv/tools/gef/gef.py
#source /opt/pwnenv/tools/peda-heap/peda.py
#source /opt/pwnenv/tools/peda-arm/peda-arm.py

# Pwngdb config Start
#source /opt/pwnenv/tools/Pwngdb/pwngdb.py
#source /opt/pwnenv/tools/Pwngdb/angelheap/gdbinit.py

define hook-run
python
import angelheap
angelheap.init_angelheap()
end
end
# Pwngdb config END
EOF

当前配置是在 root 权限下配置的,普通用户使用 gdb 没有插件,请在普通用户根目录下创建此配置文件~

验证 gdb 插件

修改 ~/.gdbinit 文件,需要使用那个插件就取消哪个插件的注释~​

ROPgadget

1
2
3
4
5
sudo apt install python3-pip
sudo -H python3 -m pip install capstone
sudo -H python3 -m pip install ROPgadget
ROPgadget --help
ROPgadget -v

Ropper

1
2
3
4
sudo pip install capstone
sudo pip install filebytes
sudo pip install keystone-engine
sudo pip install ropper

one_gadget

1
2
sudo apt install -y ruby ruby-dev
sudo gem install one_gadget

seccomp-tools

1
2
sudo apt install -y gcc ruby ruby-dev
sudo gem install seccomp-tools

LibcSearcher

1
2
3
4
5
6
7
8
9
10
11
cd /opt/pwnenv/
git clone https://github.com/lieanu/LibcSearcher.git
cd LibcSearcher/
python setup.py develop
# 需要手动更新 libc-database
rm -rf libc-database/
git clone https://github.com/niklasb/libc-database.git
cd libc-database
apt install zstd #安装依赖
./get ubuntu # 一般的PWN题环境都是Ubuntu
cd ../..

glibc-all-in-one

1
2
3
4
5
cd cd /opt/pwnenv/
git clone https://github.com/matrix1001/glibc-all-in-one.git
apt install python-is-python3
./glibc-all-in-one/update_list
cat ./glibc-all-in-one/list && cat ./glibc-all-in-one/old_list

angr

1
python3 -m pip install capstone angr

radare2

Ubuntu 可以使用下面命令安装,Kali 自带

1
2
3
4
apt install radare2

r2pm update # initialize and update the package database
r2pm install [pkg] # installs the package

或者前往Github官方文档使用 git 安装

patchelf

1
sudo apt install patchelf

edb-debugger

Ubuntu 可以使用下面命令安装,Kali 自带

1
apt install edb-debugger

或者使用源码编译安装

1
2
3
4
5
6
cd /opt/
sudo apt install cmake build-essential libboost-dev libqt5xmlpatterns5-dev qtbase5-dev qt5-default libqt5svg5-dev libgraphviz-dev libcapstone-dev
git clone --recursive https://github.com/eteran/edb-debugger.git
cd edb-debugger && mkdir build && cd build
cmake .. && make
./edb

ghidra

参照 GitHub上的安装方法即可,Kali 已经安装~

1
2
3
4
5
6
cd /opt/
wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_10.0.4_build/ghidra_10.0.4_PUBLIC_20210928.zip
unzip ghidra_10.0.4_PUBLIC_20210928.zip
mv ghidra_10.0.4_PUBLIC/ ghidra/
sudo apt install default-jdk
./ghidra/ghidraRun

安装 32 位库

1
2
sudo apt install -y libc6-dev-i386
sudo apt install -y lib32z1

跨平台架构环境配置

Qemu

安装 qemu-user

1
sudo apt install -y qemu qemu-user qemu-user-static

安装 qemu-system

1
2
3
sudo apt install -y qemu qemu-user-static qemu-system uml-utilities bridge-utils
# sudo sudo apt install qemu-system-mips
# sudo sudo apt install -y libncurses5-dev synaptic

提示:如 aarch64 安装好的库在/usr/aarch64-linux-gnu/lib/目录下qemu-aarch64执行时通过-L指定/usr/aarch64-linux-gnu目录即可,如:

1
qemu-aarch64 -L /usr/aarch64-linux-gnu ./pwn

不想手动安装的可以看最后的命令合集~

Mips

mipsel 小端序 32 位

1
sudo apt install gcc-mipsel-linux-gnu g++-mipsel-linux-gnu libc6-mipsel-cross binutils-mipsel-linux-gnu

mips 大端序 32 位

1
sudo apt install gcc-mips-linux-gnu g++-mips-linux-gnu libc6-mips-cross binutils-mips-linux-gnu

mips64el 小端序 64 位

1
sudo apt install gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64 libc6-mips64el-cross binutils-mips64el-linux-gnuabi64

mips64 大端序 64 位

1
sudo apt install gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 libc6-mips64-cross binutils-mips64-linux-gnuabi64

mipsisa32r6el 小端序 64 位

1
sudo apt install gcc-mipsisa32r6el-linux-gnu g++-mipsisa32r6el-linux-gnu libc6-mipsr6el-cross binutils-mipsisa32r6el-linux-gnu

mipsisa32r6 大端序 64 位

1
sudo apt install gcc-mipsisa32r6-linux-gnu g++-mipsisa32r6-linux-gnu libc6-mipsr6-cross libc6-mipsr6-cross binutils-mipsisa32r6-linux-gnu

注:参考文章中关于 libc6-dbg-mips* 现已无法安装,本文将去除此包~

mipsrop 插件

参照 GitHub 上的安装方法即可~

1
https://github.com/devttys0/ida/tree/master/plugins/mipsrop

Arm

armel 软浮点 小端序 32 位

1
sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libc6-armel-cross libc6-dbg-armel-cross binutils-arm-linux-gnueabi

armhf 硬浮点 小端序 32 位

1
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc6-armhf-cross libc6-dbg-armhf-cross binutils-arm-linux-gnueabi

aarch64 小端序 64 位

1
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-arm64-cross libc6-dbg-arm64-cross binutils-aarch64-linux-gnu

hppa(PA-RISC)

hppa 大端序 32 位

1
sudo apt install gcc-hppa-linux-gnu g++-hppa-linux-gnu libc6-hppa-cross libc6-dbg-hppa-cross binutils-hppa-linux-gnu

hppa64 大端序 64 位

1
sudo apt install gcc-hppa64-linux-gnu binutils-hppa64-linux-gnu

m68k

m68k 大端序 32 位

1
sudo apt install gcc-m68k-linux-gnu g++-m68k-linux-gnu libc6-m68k-cross libc6-dbg-m68k-cross binutils-m68k-linux-gnu

ppc

powerpc 大端序 32 位

1
sudo apt install gcc-powerpc-linux-gnu g++-powerpc-linux-gnu libc6-powerpc-cross libc6-dbg-powerpc-cross binutils-powerpc-linux-gnu

powerpc64 大端序 64 位

1
sudo apt install gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu libc6-ppc64-cross libc6-dbg-ppc64-cross binutils-powerpc64-linux-gnu

powerpc64le 小端序 64 位

1
sudo apt install gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc6-ppc64el-cross libc6-dbg-ppc64el-cross binutils-powerpc64le-linux-gnu

注:原博主的文章中 powerpcspe 信号处理引擎 大端序 32 位 现已无法安装,已经去除

s390x

s390x 大端序 64 位

1
sudo apt install gcc-s390x-linux-gnu g++-s390x-linux-gnu libc6-s390x-cross libc6-dbg-s390x-cross binutils-s390x-linux-gnu

sh4

sh4 小端序 32 位

1
sudo apt install gcc-sh4-linux-gnu g++-sh4-linux-gnu libc6-sh4-cross libc6-dbg-sh4-cross binutils-sh4-linux-gnu

sparc64

sparc64 大端序 64 位

1
sudo apt install gcc-sparc64-linux-gnu g++-sparc64-linux-gnu libc6-dbg-sparc64-cross

alpha

alpha 小端序 64 位

1
sudo apt install gcc-alpha-linux-gnu g++-alpha-linux-gnu libc6.1-alpha-cross libc6.1-dbg-alpha-cross binutils-alpha-linux-gnu

x86_64

i686 小端序 32 位

1
sudo apt install gcc-i686-linux-gnu g++-i686-linux-gnu libc6-i386-cross libc6-dbg-i386-cross binutils-i686-linux-gnu

x86_64x32 小端序 32 位

1
sudo apt install gcc-x86-64-linux-gnux32 g++-x86-64-linux-gnux32 libc6-x32-cross libc6-dbg-x32-cross binutils-x86-64-linux-gnux32

riscv64

riscv64 小端序 64 位

1
sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu libc6-riscv64-cross libc6-dbg-riscv64-cross binutils-riscv64-linux-gnu

ia64

ia64 小端序 64 位

只有类似 readelf 和 objdump 这种工具可以用,莫得 libc 和 gcc 以及 g++

1
sudo apt install binutils-ia64-linux-gnu

跨平台配置命令合集

适用于 Ubuntu 20.04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo apt install -y \
gcc-mipsel-linux-gnu g++-mipsel-linux-gnu libc6-mipsel-cross binutils-mipsel-linux-gnu \
gcc-mips-linux-gnu g++-mips-linux-gnu libc6-mips-cross binutils-mips-linux-gnu \
gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64 libc6-mips64el-cross binutils-mips64el-linux-gnuabi64 \
gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 libc6-mips64-cross binutils-mips64-linux-gnuabi64 \
gcc-mipsisa32r6el-linux-gnu g++-mipsisa32r6el-linux-gnu libc6-mipsr6el-cross binutils-mipsisa32r6el-linux-gnu \
gcc-mipsisa32r6-linux-gnu g++-mipsisa32r6-linux-gnu libc6-mipsr6-cross libc6-mipsr6-cross binutils-mipsisa32r6-linux-gnu \
gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libc6-armel-cross libc6-dbg-armel-cross binutils-arm-linux-gnueabi \
gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc6-armhf-cross libc6-dbg-armhf-cross binutils-arm-linux-gnueabi \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-arm64-cross libc6-dbg-arm64-cross binutils-aarch64-linux-gnu \
gcc-hppa-linux-gnu g++-hppa-linux-gnu libc6-hppa-cross libc6-dbg-hppa-cross binutils-hppa-linux-gnu \
gcc-hppa64-linux-gnu binutils-hppa64-linux-gnu \
gcc-m68k-linux-gnu g++-m68k-linux-gnu libc6-m68k-cross libc6-dbg-m68k-cross binutils-m68k-linux-gnu \
gcc-powerpc-linux-gnu g++-powerpc-linux-gnu libc6-powerpc-cross libc6-dbg-powerpc-cross binutils-powerpc-linux-gnu \
gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu libc6-ppc64-cross libc6-dbg-ppc64-cross binutils-powerpc64-linux-gnu \
gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc6-ppc64el-cross libc6-dbg-ppc64el-cross binutils-powerpc64le-linux-gnu \
gcc-s390x-linux-gnu g++-s390x-linux-gnu libc6-s390x-cross libc6-dbg-s390x-cross binutils-s390x-linux-gnu \
gcc-sh4-linux-gnu g++-sh4-linux-gnu libc6-sh4-cross libc6-dbg-sh4-cross binutils-sh4-linux-gnu \
gcc-sparc64-linux-gnu g++-sparc64-linux-gnu libc6-dbg-sparc64-cross \
gcc-alpha-linux-gnu g++-alpha-linux-gnu libc6.1-alpha-cross libc6.1-dbg-alpha-cross binutils-alpha-linux-gnu \
gcc-i686-linux-gnu g++-i686-linux-gnu libc6-i386-cross libc6-dbg-i386-cross binutils-i686-linux-gnu \
gcc-x86-64-linux-gnux32 g++-x86-64-linux-gnux32 libc6-x32-cross libc6-dbg-x32-cross binutils-x86-64-linux-gnux32 \
gcc-riscv64-linux-gnu g++-riscv64-linux-gnu libc6-riscv64-cross libc6-dbg-riscv64-cross binutils-riscv64-linux-gnu \
binutils-ia64-linux-gnu

适用于 Ubuntu 18.04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo apt install -y \
gcc-mipsel-linux-gnu g++-mipsel-linux-gnu libc6-mipsel-cross binutils-mipsel-linux-gnu \
gcc-mips-linux-gnu g++-mips-linux-gnu libc6-mips-cross binutils-mips-linux-gnu \
gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64 libc6-mips64el-cross binutils-mips64el-linux-gnuabi64 \
gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 libc6-mips64-cross binutils-mips64-linux-gnuabi64 \
libc6-mipsr6el-cross binutils-mipsisa32r6el-linux-gnu \
libc6-mipsr6-cross libc6-mipsr6-cross binutils-mipsisa32r6-linux-gnu \
gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libc6-armel-cross libc6-dbg-armel-cross binutils-arm-linux-gnueabi \
gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc6-armhf-cross libc6-dbg-armhf-cross binutils-arm-linux-gnueabi \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-arm64-cross libc6-dbg-arm64-cross binutils-aarch64-linux-gnu \
gcc-hppa-linux-gnu g++-hppa-linux-gnu libc6-hppa-cross libc6-dbg-hppa-cross binutils-hppa-linux-gnu \
gcc-hppa64-linux-gnu binutils-hppa64-linux-gnu \
gcc-m68k-linux-gnu g++-m68k-linux-gnu libc6-m68k-cross libc6-dbg-m68k-cross binutils-m68k-linux-gnu \
gcc-powerpc-linux-gnu g++-powerpc-linux-gnu libc6-powerpc-cross libc6-dbg-powerpc-cross binutils-powerpc-linux-gnu \
gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu libc6-ppc64-cross libc6-dbg-ppc64-cross binutils-powerpc64-linux-gnu \
gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc6-ppc64el-cross libc6-dbg-ppc64el-cross binutils-powerpc64le-linux-gnu \
gcc-s390x-linux-gnu g++-s390x-linux-gnu libc6-s390x-cross libc6-dbg-s390x-cross binutils-s390x-linux-gnu \
gcc-sh4-linux-gnu g++-sh4-linux-gnu libc6-sh4-cross libc6-dbg-sh4-cross binutils-sh4-linux-gnu \
gcc-sparc64-linux-gnu g++-sparc64-linux-gnu libc6-dbg-sparc64-cross \
gcc-alpha-linux-gnu g++-alpha-linux-gnu libc6.1-alpha-cross libc6.1-dbg-alpha-cross binutils-alpha-linux-gnu \
gcc-i686-linux-gnu g++-i686-linux-gnu libc6-i386-cross libc6-dbg-i386-cross binutils-i686-linux-gnu \
gcc-x86-64-linux-gnux32 g++-x86-64-linux-gnux32 libc6-x32-cross libc6-dbg-x32-cross binutils-x86-64-linux-gnux32 \
gcc-riscv64-linux-gnu g++-riscv64-linux-gnu libc6-riscv64-cross libc6-dbg-riscv64-cross binutils-riscv64-linux-gnu \
binutils-ia64-linux-gnu

适用于 Kali Linux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo apt install -y \
gcc-mipsel-linux-gnu g++-mipsel-linux-gnu libc6-mipsel-cross binutils-mipsel-linux-gnu \
gcc-mips-linux-gnu g++-mips-linux-gnu libc6-mips-cross binutils-mips-linux-gnu \
gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64 libc6-mips64el-cross binutils-mips64el-linux-gnuabi64 \
gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 libc6-mips64-cross binutils-mips64-linux-gnuabi64 \
gcc-mipsisa32r6el-linux-gnu g++-mipsisa32r6el-linux-gnu libc6-mipsr6el-cross binutils-mipsisa32r6el-linux-gnu \
gcc-mipsisa32r6-linux-gnu g++-mipsisa32r6-linux-gnu libc6-mipsr6-cross libc6-mipsr6-cross binutils-mipsisa32r6-linux-gnu \
gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libc6-armel-cross binutils-arm-linux-gnueabi \
gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc6-armhf-cross binutils-arm-linux-gnueabi \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-arm64-cross binutils-aarch64-linux-gnu \
gcc-hppa-linux-gnu g++-hppa-linux-gnu libc6-hppa-cross binutils-hppa-linux-gnu \
gcc-hppa64-linux-gnu binutils-hppa64-linux-gnu \
gcc-m68k-linux-gnu g++-m68k-linux-gnu libc6-m68k-cross binutils-m68k-linux-gnu \
gcc-powerpc-linux-gnu g++-powerpc-linux-gnu libc6-powerpc-cross binutils-powerpc-linux-gnu \
gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu libc6-ppc64-cross binutils-powerpc64-linux-gnu \
gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc6-ppc64el-cross binutils-powerpc64le-linux-gnu \
gcc-s390x-linux-gnu g++-s390x-linux-gnu libc6-s390x-cross binutils-s390x-linux-gnu \
gcc-sh4-linux-gnu g++-sh4-linux-gnu libc6-sh4-cross binutils-sh4-linux-gnu \
gcc-sparc64-linux-gnu g++-sparc64-linux-gnu \
gcc-alpha-linux-gnu g++-alpha-linux-gnu libc6.1-alpha-cross binutils-alpha-linux-gnu \
gcc-i686-linux-gnu g++-i686-linux-gnu libc6-i386-cross binutils-i686-linux-gnu \
gcc-x86-64-linux-gnux32 g++-x86-64-linux-gnux32 libc6-x32-cross binutils-x86-64-linux-gnux32 \
gcc-riscv64-linux-gnu g++-riscv64-linux-gnu libc6-riscv64-cross binutils-riscv64-linux-gnu \
binutils-ia64-linux-gnu

参考文章

跨平台架构的环境配置与调试 | binLep’s Blog
ubuntu18 安装各种 pwn 工具-Pwn-看雪论坛-安全社区|安全招聘|bbs.pediy.com
mips pwn 环境搭建 | A1ex’s Blog
arm pwn 环境搭建 | nocbtm’s Blog