Pwn专属Docker环境配置与操作

一、环境前置准备

1. 验证现有Ubuntu镜像

1
docker images
  • 预期结果:需包含 ubuntu:16.04ubuntu:18.04ubuntu:20.04 三个镜像

2. 拉取缺失镜像(若验证不通过)

1
2
3
4
5
6
7
8
# Ubuntu 16.04(对应libc-2.23,端口9997)
docker pull ubuntu:16.04

# Ubuntu 18.04(对应libc-2.27,端口9998)
docker pull ubuntu:18.04

# Ubuntu 20.04(对应libc-2.31,端口9999)
docker pull ubuntu:20.04

二、核心容器创建(3个Pwn专用环境)

容器1:Ubuntu 16.04 + libc-2.23

1
2
3
4
5
docker run -it --privileged \
-v ~/Pwn/myPwn:/root/myPwn \ # 本地仓库挂载到容器
-p 9997:9997 \ # 端口映射(主机:容器)
--name pwn-2.23 \ # 容器名称
ubuntu:16.04 /bin/bash

容器内首次启动需执行(安装调试工具):

1
apt update && apt install -y gdbserver net-tools git

容器2:Ubuntu 18.04 + libc-2.27

1
2
3
4
5
docker run -it --privileged \
-v ~/Pwn/myPwn:/root/myPwn \
-p 9998:9998 \
--name pwn-2.27 \
ubuntu:18.04 /bin/bash

容器内首次启动需执行:

1
apt update && apt install -y gdbserver net-tools git

容器3:Ubuntu 20.04 + libc-2.31

1
2
3
4
5
docker run -it --privileged \
-v ~/Pwn/myPwn:/root/myPwn \
-p 9999:9999 \
--name pwn-2.31 \
ubuntu:20.04 /bin/bash

容器内首次启动需执行:

1
apt update && apt install -y gdbserver net-tools git

三、容器日常管理指令

1. 启动容器

1
2
3
4
5
# 启动单个容器(示例:pwn-2.27)
docker start pwn-2.27

# 启动所有Pwn容器(一键操作)
docker start pwn-2.23 pwn-2.27 pwn-2.31

2. 进入已启动的容器

1
2
3
4
5
6
# 进入单个容器(示例:pwn-2.27)
docker exec -it pwn-2.27 /bin/bash

# 进入其他容器
docker exec -it pwn-2.23 /bin/bash # 16.04环境
docker exec -it pwn-2.31 /bin/bash # 20.04环境

3. 停止容器

1
2
3
4
5
6
7
8
# 停止单个容器(示例:pwn-2.27)
docker stop pwn-2.27

# 停止所有Pwn容器
docker stop pwn-2.23 pwn-2.27 pwn-2.31

# 停止所有运行中的容器(快速清理)
docker stop $(docker ps -q)

4. 查看容器状态

1
2
3
4
5
# 查看运行中的容器
docker ps

# 查看所有容器(运行中+已停止)
docker ps -a

5. 重启容器(解决卡死或配置生效)

1
2
# 示例:重启pwn-2.27
docker restart pwn-2.27

四、Pwn调试核心操作

1. 单步调试模式(推荐)

进入对应容器后,执行以下步骤(替换题目路径/文件名):

1
2
3
4
5
6
7
8
# 进入题目目录(示例)
cd /root/myPwn/babyheap-2.27

# 赋予执行权限
chmod +x ./babyheap

# 启动gdbserver(等待主机连接)
gdbserver 0.0.0.0:9998 ./babyheap
  • 成功标志:容器内显示 Listening on port 9998

2. 快速测试模式(无需单步调试)

1
2
3
cd /root/myPwn/题目文件夹名
chmod +x ./题目文件名
./题目文件名 | nc -l 0.0.0.0 9998 # 用nc转发端口

3. 验证端口监听状态(排查连接问题)

容器内执行:

1
netstat -tuln
  • 预期结果:调试时对应端口(9997/9998/9999)显示为 LISTEN 状态

4. 主机与容器文件互传(应急用)

1
2
3
4
5
# 主机 → 容器(示例:传exp.py到pwn-2.27)
docker cp ~/Pwn/myPwn/exp.py pwn-2.27:/root/myPwn/

# 容器 → 主机(示例:传flag.txt到本地)
docker cp pwn-2.27:/root/myPwn/flag.txt ~/Pwn/

五、容器退出方式

1. 退出后停止容器(调试完成)

容器内输入:

1
exit
  • 效果:返回主机终端,容器状态变为 Exited

2. 退出后保留运行(暂时离开)

容器内按组合键:

1
Ctrl + P + Q  # 先按Ctrl+P,再按Ctrl+Q(顺序不可换)
  • 效果:返回主机终端,容器仍在后台运行(状态为 Up

六、镜像管理(备份/恢复)

1. 查看本地镜像

1
docker images

2. 备份镜像(换设备/重装系统)

1
2
3
4
5
6
7
8
# 创建备份目录
mkdir -p ~/docker-backup

# 备份单个镜像(示例:ubuntu:18.04)
docker save -o ~/docker-backup/ubuntu18.04-pwn.tar ubuntu:18.04

# 备份所有Pwn基础镜像
docker save -o ~/docker-backup/ubuntu-all-pwn.tar ubuntu:16.04 ubuntu:18.04 ubuntu:20.04

3. 恢复备份的镜像

1
2
3
4
5
# 恢复单个镜像(示例:ubuntu:18.04)
docker load -i ~/docker-backup/ubuntu18.04-pwn.tar

# 恢复所有镜像
docker load -i ~/docker-backup/ubuntu-all-pwn.tar

4. 删除镜像(谨慎操作)

1
2
3
# 先删除依赖容器,再删除镜像(示例:ubuntu:16.04)
docker stop pwn-2.23 && docker rm pwn-2.23
docker rmi ubuntu:16.04

七、容器删除(谨慎使用)

1. 删除单个容器

1
2
# 先停止,再删除(示例:pwn-2.23)
docker stop pwn-2.23 && docker rm pwn-2.23

2. 清理所有已停止的容器

1
docker rm $(docker ps -a -q)

3. 强制删除运行中的容器(不推荐)

1
docker rm -f pwn-2.23

八、问题排查指令

1. 查看容器详细配置(IP/挂载/端口)

1
2
3
4
5
# 查看pwn-2.27详细信息
docker inspect pwn-2.27

# 快速获取容器IP
docker inspect pwn-2.27 | grep "IPAddress"

2. 查看容器运行日志(题目崩溃/报错时)

1
2
# 查看pwn-2.27日志
docker logs pwn-2.27

3. 检查端口映射是否生效

1
2
3
4
5
# 查看所有容器端口映射
docker port $(docker ps -q)

# 查看单个容器映射(示例:pwn-2.27)
docker port pwn-2.27

九、快捷指令(一键复用)

  1. 一键启动所有容器并进入pwn-2.27:
1
docker start pwn-2.23 pwn-2.27 pwn-2.31 && docker exec -it pwn-2.27 /bin/bash
  1. 一键停止所有容器并查看状态:
1
docker stop pwn-2.23 pwn-2.27 pwn-2.31 && docker ps -a
  1. 容器内快速启动题目(pwn-2.27示例):
1
cd /root/myPwn/题目文件夹名 && chmod +x ./题目文件名 && gdbserver 0.0.0.0:9998 ./题目文件名

十、核心配置对照表

容器名 Ubuntu版本 libc版本 映射端口 本地挂载路径 容器内挂载路径
pwn-2.23 16.04 2.23 9997 ~/Pwn/myPwn /root/myPwn
pwn-2.27 18.04 2.27 9998 ~/Pwn/myPwn /root/myPwn
pwn-2.31 20.04 2.31 9999 ~/Pwn/myPwn /root/myPwn

十一、日常调试流程总结

  1. 启动容器:docker start pwn-2.27(按需替换容器名)
  2. 进入容器:docker exec -it pwn-2.27 /bin/bash
  3. 启动题目:cd /root/myPwn/题目目录 && gdbserver 0.0.0.0:9998 ./题目名
  4. 主机调试:激活Python环境 → 运行脚本(连接对应端口)
  5. 结束操作:exit(退出容器)→ docker stop pwn-2.27(停止容器)

十二、Ubuntu 16.04 安装zsh(解决软件源问题)

Ubuntu 16.04 zsh安装步骤

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
# 1. 更换软件源(解决Ubuntu 16.04软件源过期问题)
cp /etc/apt/sources.list /etc/apt/sources.list.backup

# 使用archive.ubuntu.com(最稳定的源)
cat > /etc/apt/sources.list << 'EOF'
deb http://archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
EOF

# 2. 更新软件源
apt update

# 3. 只安装最基本的zsh
apt install -y zsh

# 4. 创建极简配置
cat > ~/.zshrc << 'EOF'
export TERM=xterm-256color
PS1="[%n@%m %~]$ "
alias ll='ls -la'
alias pwn-cd='cd /root/myPwn'
EOF

# 5. 设置默认shell
chsh -s $(which zsh)

# 6. 退出并重新进入测试
exit
docker exec -it pwn-2.23 zsh

Ubuntu 16.04 zsh颜色配置(可选)

如果极简配置工作正常,可以添加颜色:

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
# 备份当前配置
cp ~/.zshrc ~/.zshrc.backup

# 创建带颜色的配置
cat > ~/.zshrc << 'EOF'
# 启用颜色支持
autoload -U colors && colors

# 设置彩色提示符
PS1="%{$fg[green]%}%n@%m%{$reset_color%}:%{$fg[blue]%}%~%{$reset_color%}$ "

# 设置终端类型
export TERM=xterm-256color

# 启用自动补全
autoload -U compinit
compinit

# 设置别名(带颜色)
alias ls='ls --color=auto'
alias ll='ls -la --color=auto'
alias grep='grep --color=auto'
alias pwn-cd='cd /root/myPwn'
alias gdb-start='gdbserver 0.0.0.0:9997'
alias pwn-env='echo "Ubuntu 16.04 - libc 2.23 - Port 9997"'
EOF

# 重新加载配置
source ~/.zshrc

十三、Ubuntu 18.04/20.04 安装zsh(标准方法)

Ubuntu 18.04/20.04 zsh安装步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 进入容器
docker exec -it pwn-2.27 /bin/bash # 或 pwn-2.31

# 安装zsh
apt update && apt install -y zsh

# 创建配置(可根据需要选择极简或彩色版本)
cat > ~/.zshrc << 'EOF'
export TERM=xterm-256color
PS1="[%n@%m %~]$ "
alias ll='ls -la'
alias pwn-cd='cd /root/myPwn'
alias gdb-start='gdbserver 0.0.0.0:9998' # 18.04用9998,20.04用9999
alias pwn-env='echo "Ubuntu 18.04 - libc 2.27 - Port 9998"' # 相应修改版本信息
EOF

# 设置默认shell
chsh -s $(which zsh)

十四、注意事项

  1. Ubuntu 16.04必须更换软件源后才能正常安装zsh
  2. 如果遇到locale错误,可执行:export LANG=C
  3. 极简配置确保兼容性,彩色配置提供更好体验
  4. 建议先测试极简配置,确认正常后再尝试彩色配置