PWN入门之二:配置PWN环境

PWN入门之二:配置PWN环境

文章参考:CTFWiki

0x00 前言

现在的CTF-PWN以Linux下的用户态Pwn为主,更准确的说,是以Ubuntu这个Linux发行版的环境为主。因此,为了方便调试程序,我们需要不同版本的Ubuntu,因为有些漏洞只有再特定版本下才能触发,但是为每一个Ubuntu版本都配置一个拥有Pwn环境的虚拟机确实是不太现实,是安装虚拟机和配置环境非常消耗时间,而且每个虚拟机最少需要20GB的储存空间,最少2GB内存,如果这样操作,在我们打比赛的时候,最少也需要开3个虚拟机,两个版本的Ubuntu,一个kali(因为正经比赛不可能只做一个方向的题),再加上物理机上的windows系统,除非你的电脑是神机,否则可定吃不消,所以这里推荐只需要装一个kali虚拟机,然后在kali上安装docker,并依靠docker来搭建Pwn做题环境,这样做的好处就是节省开销,并且切换丝滑。

传统 CTF-Pwn 题目通常仅需要以下工具便能完成解题:

  • IDA:对题目进行逆向分析
  • Python + pwntools:用于编写漏洞利用脚本。
  • gdb + pwndbg/peda:用于调试题目二进制文件。

需要注意的是,在初学阶段我们并不推荐任何基于 pwntools 进行过度二次包装的软件包,也不推荐你在利用脚本中使用 lambda 语句进行过度简化,我们更推荐你在学习到一定程度后再去根据个人使用习惯进行决定。

下面,我们从物理机上的配置出发,一步一步,手把手教你配置Pwn环境。

0x01 IDA的安装

噫!礼赞逆位之女神,为吾等撕开混沌之帷幕,令凡胎得窥深渊底层不可名状之真理。

IDA的安装和其他Windows上的软件安装并没有什么不同,但是这玩意是付费的,所以我们这里安装的是绿色学习版,如果你有下载和安装学习版游戏的经验,这一步非常简单。

下载链接

吾爱破解论坛

关于IDA的基础使用方法,详见此处应该补充一条链接,如果没有补充,请联系我

0x02 VM虚拟机的安装

VM之前是需要付费的,不过被博通收购之后就成免费的了,不过有一点不好就是虚拟机的vmtools需要手动安装,不过这点我们不需要考虑,Kali Linux 自2019.3版本起,在安装过程中如果检测到运行在VMware虚拟机中,会自动安装open-vm-tools及open-vm-tools-desktop软件包以替代VMware Tools增强虚拟机功能。

下载链接

百度网盘提取码NBAL

image-20250703192158100

下载好后解压,如果你不会7z格式压缩文件的解压的话,请自行必应。

详细的安装方法请见VMware17超详细安装方法

0x03 Kali Linux的安装

这将是你们学习网安的第一道坎,如果你不会解压的话另当别论,安装虚拟机比较耗费时间,所以建议你专门找出一段空闲的时间来干这个。

详细安装步骤

1、下载kali镜像

下载链接:kali.org

进去之后就会有一个大大的**DOWNLOAD**摆在你眼前,点击它,来到选择镜像的页面。

我们选择这个选项

image-20250703194230293

一共有两种下载方式,选择适合自己的方式,推荐**磁力下载**

image-20250703194417584

下载好后是一个.iso文件

2、在虚拟机上安装kali Linux

打开我们的VMware

点击创建虚拟机

image-20250703200239560

点击自定义,然后点击下一步

image-20250703200339669

硬件兼容性选择Workstation 17.5 or later,然后点击下一步

image-20250703200523703

选择稍后安装操作系统

image-20250703200611451

客户机系统选择**Linux,版本选择Debian 12.x 64位**

image-20250703201025265

虚拟机名称随便起,位置最好选择D盘(如果你有)

image-20250703201147824

处理器配置如下

image-20250703201856413

内存分配8GB

image-20250703201927344

网络连接方式选择NAT

image-20250703202005687

I/O控制器类型选择**LSI Logic**

image-20250703202111516

虚拟磁盘类型选择**SCSI**

image-20250703202140215

选择创建新的虚拟磁盘

image-20250703202215350

最大磁盘大小最好50GB以上,因为光kali Linux系统就需要23GB左右,后续构建Pwn环境镜像,一个镜像3~4个G,硬盘太小装不下。然后将虚拟硬盘储存为单个文件

image-20250703202439681

直接下一步

image-20250703202457896

然后点击完成,这样虚拟机的壳子我们就搭建好来,下面来安装系统。

在虚拟机的侧边栏可以看到虚拟机的配置,我们双击**CD/DVD**,之后选择使用ISO映像文件,选择刚刚下载的.iso文件

image-20250705143732980

然后开启此虚拟机

选择第一个安装方式,按回车

image-20250705143842634

在选择语言界面,选择English,因为英语环境下kali的安装成功率高,中文环境很容易报错

image-20250705144047503

后面的选项不用管,直接continu两步,完成语言选择,进入一个加载页面,等待加载完成

设置主机名,注意,主机名不等于用户名,这里相当于给虚拟机起个名字

image-20250705144427171

设置域名,改成空,就是里面不写任何东西

image-20250705144500161

输入的全名,也就是真名(woc,盒),用于标识用户,不过咱也就是学学网安,打打比赛,这里填用户名就行了

image-20250705144813847

输入用户名

image-20250705145311873

输入密码,简单一点,方便使用

image-20250705145404249

使用区域和时间

image-20250705145514074

格式化磁盘,选择使用整个磁盘

image-20250705145638329

image-20250705145650786

image-20250705145707844

image-20250705145730103

选择Yes

image-20250705145809637

然后是一段短暂的安装。这里默认就好

image-20250705145934037

然后就是一段漫长的安装,耐心等待。

这里选择yes

image-20250705154756875

这里选择/dev/sda

image-20250705154834275

选择continue重启虚拟机

image-20250705154949170

这样我们的虚拟机就安装好了,搞完这些,你可以去喝杯水,休息一下,因为后面还有很长一段路要走。

0x04 配置Kali Linux

刚安装好的kali看起来非常不友善,所以我们需要进一步配置,让它变得好用一点。

1、设置kali终端字体

快捷键CTRL+ALT+T打开终端(记住这个快捷键,很常用)。可以看到,字体非常小,所以我们来让它变大一点。

在右上角,找到File选项卡,找到里面的Preferences选项,中文名叫“首选项”,这个名称在很多软件中是通用的,举一反三。

image-20250705163152677

然后Font那一栏找到Change,然后将Size改成18,Font用来改字体,你也可以改成自己喜欢的字体

image-20250705163324586

改完之后就好看多了。

2、换源和更新系统

这是国内所有Linux发行版安装后的必备操作了,因为大部分Linux发行版的软件源都位于国外,所以访问时间较长,速度减慢(尤其校园网),所以我们就需要把软件源换成国内的,这样在更新系统和后续安装软件的过程中,速度会更快。

  1. 先来给root用户换个密码,因为后面很多安装操作基于root权限操作,我觉得老是需要打一个sudo很麻烦,不如直接su到root用户安装的爽。
    输入如下命令切换到root用户,密码就是你的密码。

    注意:这是在终端中操作,终端中的粘贴快捷键是CTRL+SHIFT+V,复制同理。

    注意:密码不会回显,并不是虚拟机没有读取输入 ,也不是你的键盘有问题。

    1
    sudo su

    看到命令提示符从$变成#就是成功了

    然后再输入下面的命令,回车

    1
    passwd

    注意!,和上面一样,读取密码的时候是不会有回显的。

    一般改成toor就行了,好记。有passwd: password updated successfully这样的提示就是改好了。

    然后输入exit退出root用户,在普通用户下输入如下指令,在输入你设置的root密码,看看有没有能不能登录上,要是不行,就重复上面的步骤,重新设置一下。

    1
    su
  2. 上一步验证完不要着急退出,在root用户下,输入如下命令

    1
    cp /etc/apt/sources.list /etc/apt/sourcesinit

    把原来用来放软件源的文件复制并改名。

    然后用如下命令打开sources.list

    1
    vim /etc/apt/sources.list

    之后一直按D键把原来的软件源都删掉,然后把下面的软件源复制进去

    1
    2
    3
    4
    5
    6
    # 中科大Kali镜像源
    deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free non-free-firmware contrib
    deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free non-free-firmware contrib
    # 阿里云Kali镜像源
    deb http://mirrors.aliyun.com/kali kali-rolling main non-free non-free-firmware contrib
    deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free non-free-firmware contrib

    然后输入,一定是输入:,不是按这个键,然后输入wq退出。

  3. 换完源之后输入如下命令进行系统更新

    1
    apt-get update;apt-get upgrade -y;apt-get dist-upgrade

    又是一段漫长的等待。

    然后清理缓存包

    1
    apt-get clean && apt-get autoclean

3、更改系统语言和安装输入法

很多人倡议使用英文界面,但是对刚开始学习网安且过去12学习的都是应试英语的我们,英文界面还是不太友好,所以这里我们把kali的系统语言改为中文,减轻一点学习上的负担。

  1. 切换到root用户,输入如下命令

    1
    dpkg-reconfigure locales

    会进入到如下页面


    上下键移动,移到最底部,找到zh_CN.UTF-8,空格选择,然后回车。

  2. 下面来到这样的页面,依旧选择zh_CN.UTF-8然后回车

  3. 然后输入reboot重启

  4. 重启之后可以看到我们的登陆界面就变成中文的了,登录之后,你会收到这样的提醒
    image-20250705172729623
    勾选“不要再次询问我”,并且**保留旧的名称**,不要用中文,用中文的话到时候使用命令行打文件路径的时候会很麻烦,这几个单词还是挺常见的,不用换。

  5. 下面我们来安装中文输入法,平常也用不着,安装它也就是给脚本写写注释。
    输入下面的命令安装fcitx5输入法

    1
    apt install fcitx5 fcitx5-pinyin

    安装完reboot重启一下。

  6. 重启完点开左上角的开始菜单,搜索fcitx5,找到fcitx5配置,可以看到里面有拼音的选项

    image-20250706172831333

  7. 然后我们打开全局配置,可以看到它的快捷键。

4、安装docker

  1. 安装docker

    先切换到root用户
    输入如下命令安装docker

    1
    apt install -y docker.io

    安装好之后使用如下命令开启docker,这次开启之后以后就会自动开启。

    1
    systemctl enable docker --now

    然后输入如下命令,如果输出一大串帮助提示,那就是安装好了

    1
    docker
  2. 添加你的用户到docker用户组
    安装好docker以后,只有root用户才能使用docker相关的命令,这样非常不方便,我们把我们的用户添加到用户组,方便使用。

    1
    usermod -aG docker $USER

5、创建镜像和容器

注意:这里的所有操作,要挂梯子完成。

现在我们在主文件夹下创建一个Dockerfiles文件夹,再在该文件夹下创建一个22.04文件夹,然后在22.04文件夹下创建一个文件,不需要任何后缀,就叫Dockerfile,容纳后把下面的内容复制到该文件内。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
FROM ubuntu:22.04

# 1.环境设置
ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai \
LC_ALL=C.UTF-8 \
LANG=C.UTF-8 \
PIP_NO_CACHE_DIR=on
WORKDIR /CTF
RUN mkdir -p /glibc

# 2.设置清华源加速
RUN sed -i "s|http://archive.ubuntu.com|http://mirrors.tuna.tsinghua.edu.cn|g" /etc/apt/sources.list && \
sed -i "s|http://security.ubuntu.com|http://mirrors.tuna.tsinghua.edu.cn|g" /etc/apt/sources.list

# 3.安装系统工具和基础软件
RUN dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
gcc-multilib \
gcc-9-multilib \
g++-multilib \
gdb \
gdb-multiarch \
python3 \
python3-pip \
python3-dev \
python3-venv \
libc6-dbg \
libc6-dbg:i386 \
lib32stdc++6 \
lib32z1 \
qemu-system \
qemu-user \
qemu-user-static \
binutils \
file \
strace \
ltrace \
netcat \
socat \
openssh-server \
git \
curl \
wget \
zsh \
locales \
ca-certificates \
ruby-full \
patchelf \
busybox \
libssl-dev \
cmake \
ninja-build \
pkg-config \
gawk \
flex \
bison \
gcc-10 \
gcc-10-multilib \
tmux \
vim \
&& \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

# 4.安装python虚拟环境
RUN python3 -m venv /opt/pwn_venv
ENV PATH="/opt/pwn_venv/bin:$PATH" \
VIRTUAL_ENV="/opt/pwn_venv"

# 5.安装基本 PWN 工具链
RUN /opt/pwn_venv/bin/pip install --upgrade pip setuptools wheel && \
/opt/pwn_venv/bin/pip install \
pwntools \
ropgadget \
z3-solver \
angr \
capstone \
unicorn \
keystone-engine \
ropper \
r2pipe \
lief \
pyelftools \
smmap2 \
apscheduler \
pebble \
zio \
LibcSearcher

# 6.安装 one_gadget (Ruby gem)
RUN gem install one_gadget seccomp-tools

# 7.安装 pwndbg
RUN git clone --depth 1 https://github.com/pwndbg/pwndbg /opt/pwndbg && \
cd /opt/pwndbg && ./setup.sh

# 8.安装main_arena_offset
RUN git clone https://github.com/bash-c/main_arena_offset.git /tmp/main_arena_offset_src && \
mv /tmp/main_arena_offset_src/main_arena /usr/local/bin/main_arena_offset && \
chmod +x /usr/local/bin/main_arena_offset && \
rm -rf /tmp/main_arena_offset_src

# 9.安装 glibc_all_in_one
RUN git clone https://github.com/matrix1001/glibc-all-in-one.git /root/glibc-all-in-one

# 10.创建工具符号链接
RUN ln -s /usr/bin/patchelf /usr/local/bin/patchelf && \
ln -s /bin/busybox /usr/local/bin/busybox && \
ln -s /opt/pwn_venv/bin/checksec /usr/local/bin/checksec && \
ln -s /opt/pwn_venv/bin/one_gadget /usr/local/bin/one_gadget_python && \
ln -s /opt/pwn_venv/bin/ROPgadget /usr/local/bin/ROPgadget

# 11.SSH配置
RUN mkdir -p /run/sshd
RUN mkdir -p /run/sshd && \
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config && \
echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && \
echo "UseDNS no" >> /etc/ssh/sshd_config && \
echo "StrictModes no" >> /etc/ssh/sshd_config && \
echo "UsePAM no" >> /etc/ssh/sshd_config && \
echo "root:123456" | chpasswd

# 12.QEMU静态二进制增强
RUN if [ ! -f /usr/bin/qemu-i386-static ]; then wget -q https://github.com/multiarch/qemu-user-static/releases/download/v7.0.0/qemu-i386-static -O /usr/bin/qemu-i386-static && chmod +x /usr/bin/qemu-i386-static; fi && \
if [ ! -f /usr/bin/qemu-arm-static ]; then wget -q https://github.com/multiarch/qemu-user-static/releases/download/v7.0.0/qemu-arm-static -O /usr/bin/qemu-arm-static && chmod +x /usr/bin/qemu-arm-static; fi

# 13.安装oh-my-zsh (无插件)
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended && \
sed -i 's/^plugins=.*/plugins=()/' /root/.zshrc && \
sed -i 's/ZSH_THEME=.*/ZSH_THEME="simple"/' /root/.zshrc

# 14.修改.zshrc
RUN echo "source /opt/pwn_venv/bin/activate" >> /root/.zshrc && \
echo 'alias one_gadget="/usr/local/bin/one_gadget_python"' >> /root/.zshrc && \
echo 'alias gdb="gdb -q"' >> /root/.zshrc && \
echo 'export GLIBC_DIR="/glibc"' >> /root/.zshrc

# 15.健康检查和元数据
HEALTHCHECK --interval=30s --timeout=3s \
CMD ss -ltn | grep -q ':22' || exit 1
LABEL maintainer="pwn-env-admin@example.com" \
version="2.5" \
description="Root-only PWN CTF Environment"

# 16.预配置VSCode的Python解释器路径
RUN mkdir -p /root/.vscode-server/data/Machine && \
echo '{"python.defaultInterpreterPath": "/opt/pwn_venv/bin/python3"}' > /root/.vscode-server/data/Machine/settings.json && \
echo '{"python.analysis.extraPaths": ["/opt/pwn_venv/lib/python3.10/site-packages"]}' >> /root/.vscode-server/data/Machine/settings.json

# 17.将默认shell改为zsh (最后执行)
RUN chsh -s /usr/bin/zsh

# 18.启动配置
EXPOSE 22
ENTRYPOINT ["/usr/sbin/sshd", "-D", "-e"]

随后,运行如下指令,这一步会花费很长时间。

1
2
cd ~/Dockerfiles/22.04/
docker build -t pwnenv_ubuntu22 .

其实我原本打算吧Ubuntu16和18的Dockerfile也放上来,但是这个两个版本的问题就是系统太老了,网络上的Dockerfile大多都不能用,自己写的还有点小问题,所以打算等我搞好了再放上来。

完成之后你便拥有了一个名为 pwnenv_ubuntu24 的带有做题环境的 Ubuntu24 镜像,可以通过 如下命令查看:

1
docker images  

终端输出如下

1
2
3
$ docker images                    
REPOSITORY TAG IMAGE ID CREATED SIZE
pwnenv_ubuntu22 latest 296a4ce2a2db 6 minutes ago 3.95GB

下面我们根据构建好的容器来创建容器

我们先做些准备工作,在桌面创建一个名叫CTF的文件夹,但是注意,创建时一定要退出root用户,然后用自己的用户创建。然后运行如下命令

1
2
3
4
5
6
7
8
docker run \
-d \
-p "25000:22" \
--name=pwn24 \
-v ~/Desktop/CTF:/CTF \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=$DISPLAY \
pwnenv_ubuntu22

个参数说明如下:

  • -d: 使容器在后台运行
  • -p 25000:22: 容器的 22 端口映射到本地的 25000 端口
  • --name=pwn24: 容器名为 pwn24
  • -v ~/Desktop/CTF:/CTF : 将本地的 ~/Desktop/CTF 目录映射到容器中的 /CTF 目录,这样我们便能在容器内访问到本地文件,而无需将文件重复拷贝进容器中
  • `pwnenv_ubuntu22:创建容器所使用的镜像
  • 其他的参数是用来将 Docker 容器接入本地图形界面,便于GDB调试。

之后在运行 gdb.attach() 之前运行如下 python 语句进行配置

1
context.terminal = ['xfce4-terminal', '-e', 'sh', '-c']

然后我们通过ssh链接容器

1
ssh root@localhost -p 25000

输入命令后会询问你是否记忆该连接(大概),输入yes就行,然后再输入Dockerfile中配置的密码123456就可以连接了。

输入exit退出ssh连接。

6、安装和配置VScode

这一步我也是一边配一边写,所以写的并不好,还请各位师傅海涵,在配置好用的做题环境上,我也在摸索,如果您有更好的解决方法,请您联系我。

  1. 下载VScode,在kali自带的浏览器里面搜索VScode就行,下载.deb文件

  2. 在下载好之后,一般在Download目录,输入如下命令安装

    1
    dpkg -i [你刚刚下好的文件]
  3. 打开之后是英文界面,我们需要切换到中文,我们需要在左侧边栏点击倒数第二个图标,然后在其新打开的窗口处的顶部(不是整个界面的最顶部)的搜索栏输入chinese,第一个就是,然后点击Install,安装完重启,重启之后就是中文界面了。

  4. 安装Remote - Containers扩展,在顶部搜索ms-vscode-remote.remote-containers,第一个就是,安装。

  5. 安装好之后点击整个界面左下角类似于><的图标,然后在顶部点击附加到正在运行的容器,之后,VScode就成功的连接上容器,并且可以使用里面的库。

  6. 关于字体,装在虚拟机里的VScode不太好看,下面来设置一下,点击左下角的齿轮图标,然后点击设置,然后在文本编辑器选项中选择字体选项,VScode不像其它软件,可以一个一个选字体,它只能手动输入,我们先安装一下字体

    1
    2
    3
    4
    5
    6
    7
    apt-get install -y --no-install-recommends \
    fonts-hack \
    fonts-hack-ttf \
    fonts-hack-web && \
    rm -rf /var/lib/apt/lists/*

    fc-cache -fv

    然后再把字体那栏下面的Font Family的输入框内输入

    1
    'Hack', 'Fira Code', 'Consolas', 'Courier New', monospace

    然后再将下面的字体大小改成20或者你看着舒服的大小。

    把用户,远程和工作区的这些选项都改了。

  7. 关于界面,有的电脑的虚拟机上VScode界面会特别小,我们依旧在设置中,搜索zoom level,然后把0改成1,就差不多了,如果还是小,那就再往大调调。


PWN入门之二:配置PWN环境
https://www.xuanyuan-blog.top/2025/07/03/PWN入门之二:配置PWN环境/
作者
玄渊
发布于
2025年7月3日
许可协议