主要内容如下:
关于docker
的基础概念不做过多的介绍。可以到Docker : Accelerated, Containerized Application Development官方网站上获取更多的信息。熟悉并使用docker
的常用命令并不需要太多的时间。
在使用docker
指令或者docker-compose
的指令时,尽量到官方手册上查询有关指令的详情内容。
一般来说,使用docker-compose
来运行多个容器,也可以集成编译镜像、运行实例等流程。
如果需要一个完整的、经常使用的主力调试环境,我推荐使用skysider/pwndocker: A docker environment for pwn in ctf (github.com),工具非常完整,可以直接拉取镜像。
本文所分享的,是临时使用的、快速的、轻量级调试环境。镜像只包含必要的程序,镜像包相对较小,下载更快。
对于不同的版本,特别是传统的glibc
的环境,有时候使用patchelf
改变二进制文件的so
无法得到与远程环境一样的内存布局,并且会缺乏调试符号。而对于部署在debian/fedora
等其他操作系统上的程序,受到的影响会更大。因此,使用docker
搭建一个一模一样的调试环境很有必要。
目前,我针对常用的环境制作了轻量级镜像,并发布在roderickchan/debug_pwn_env Tags | Docker Hub。
每个镜像都给出了 Ubuntu
的版本、其使用的 glibc libc.so.6
的具体版本(包括小版本)和镜像编译时间。
直接使用docker pull roderickchan/debug_pwn_env:22.04-2.35-0ubuntu3.1-20230213
这样的命令拉取镜像即可。
拉取镜像后,运行命令如下:
可以映射宿主机端口和容器端口,映射文件或者目录。如果不带命令,容器会自动更新一些pwn
相关的仓库和包,如果带上命令,就会执行指定的命令。
事实上这个镜像的Dockerfile
如下:
内置了自使用的tmux
配置文件和gdb-gef/gdb-pwndbg
启动脚本以及最新的pwncli
库。完整文件位于GitHub - RoderickChan/docker_pwn_env: Debug pwn using docker image,可根据需求更改和自定义配置文件。
如果是debian
系统,只需要安装一些基础的包即可:
这里选用gef
插件,因为gef
插件的依赖少,安装速度快,功能比peda
强大。
如果是fedora
系统,安装软件包列表如下:
和上面基本是一样的,不过有些包的名字不一样。
使用示例如下,使用最新的版本,普通用户的用户名为ctf
(我的主力机器为Ubuntu 20.04
,但是该题目运行环境需要Ubuntu 22.04
):
这是另一个示例,使用之前的版本,普通用户名为roderick
:
出题模板可以参考GitHub - RoderickChan/deploy_pwn_template: Templates for deploying pwn challenge in ctf
这里列出了11
中出题模板文件,只需要按照不同的模板文件把二进制文件替换一下,设置flag
等操作即可。
不同的模板各有优缺点。大部分的模板都支持从环境变量中动态获取flag
和设置sha256
的proof of work
。
总有一款适合你。
以ubuntu+xinetd+chroot
为例,把题目源码放置在src
目录下,修改编译文件和Dockerfile
中的编译环境。
如果需要动态flag
,就把docker-compose.yaml
的FLAG
环境变量设置为真正的flag
,如果不需要,删除FLAG
环境变量即可。
如果需要pow
,就把docker-compose.yaml
的ENABLE_POW
环境变量设置为1
,否则设置为0
或者删除均可。
如下图,使用pow
时会验证sha256
,可有效地避免爆破。
这里给出一些我使用docker
的调试技巧。
docker run -it --
rm
-
v
host_path:container_path -p host_port:container_port --cap-add=SYS_PTRACE IMAGE_ID
docker run -it -
rm
-
v
host_path:container_path -p host_port:container_port --cap-add=SYS_PTRACE IMAGE_ID
/bin/bash
docker run -it --
rm
-
v
host_path:container_path -p host_port:container_port --privileged IMAGE_ID
docker run -it --
rm
-
v
host_path:container_path -p host_port:container_port --cap-add=SYS_PTRACE IMAGE_ID
docker run -it -
rm
-
v
host_path:container_path -p host_port:container_port --cap-add=SYS_PTRACE IMAGE_ID
/bin/bash
docker run -it --
rm
-
v
host_path:container_path -p host_port:container_port --privileged IMAGE_ID
#!/bin/bash
set
-ex
apt update && apt
install
-y tmux gdb gdbserver wget rpm
file
binutils socat python3 python3-pip procps
cat
> ~/.tmux.conf <<
"EOF"
set
-g prefix C-a
unbind C-b
bind C-a send-prefix
set
-option -g prefix2 `
unbind
'"'
bind - splitw -
v
-c
'#{pane_current_path}'
# 垂直方向新增面板,默认进入当前目录
unbind %
bind | splitw -h -c
'#{pane_current_path}'
# 水平方向新增面板,默认进入当前目录
bind j resize-pane -D 10
bind k resize-pane -U 10
bind h resize-pane -L 10
bind l resize-pane -R 10
EOF
pip3
install
pwntools pwncli
bash
-c
"$(wget https://gef.blah.cat/sh -O -)"
#!/bin/bash
set
-ex
apt update && apt
install
-y tmux gdb gdbserver wget rpm
file
binutils socat python3 python3-pip procps
cat
> ~/.tmux.conf <<
"EOF"
set
-g prefix C-a
unbind C-b
bind C-a send-prefix
set
-option -g prefix2 `
unbind
'"'
bind - splitw -
v
-c
'#{pane_current_path}'
# 垂直方向新增面板,默认进入当前目录
unbind %
bind | splitw -h -c
'#{pane_current_path}'
# 水平方向新增面板,默认进入当前目录
bind j resize-pane -D 10
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!