CTF Pwn 题目设计指南
字数 1323 2025-11-11 12:14:45
CTF Pwn 题目设计指南
一、前言
当前大多数动态 Flag 的 Pwn 题目都基于开源项目 ctf_xinetd 进行部署,该项目通过 xinetd 和 Docker 技术,将题目运行在低权限、隔离良好的环境中,有效提升了服务的安全性与稳定性。
项目地址:https://github.com/Eadom/ctf_xinetd
二、Docker 环境构建
安装 Docker
使用官方提供的安装脚本,推荐通过国内镜像源加速下载。
基本构建命令
# 构建镜像(假设当前目录下有 Dockerfile)
docker build -t pwn_challenge .
# 启动容器并映射端口(如9999)
docker run -d -p 9999:9999 --name pwn_container pwn_challenge
# 测试连接
nc localhost 9999
# 进入容器调试
docker exec -it pwn_container /bin/bash
常用 Docker 命令
# 镜像管理
docker images # 列出本地所有镜像
docker rmi <image_id> # 删除指定镜像
# 容器管理
docker ps -a # 查看所有容器(包括已停止的)
docker stop <container_id> # 停止运行中的容器
docker rm <container_id> # 删除已停止的容器
# 调试操作
docker exec -it your_stack /bin/bash # 进入容器交互式调试
# 退出容器终端:按 Ctrl+D 或输入 exit
三、Dockerfile 配置
32位程序特殊处理
32位程序运行需要显式启用 i386 架构并安装相应的 32 位兼容库。
典型 Dockerfile 示例
FROM ubuntu:20.04
RUN dpkg --add-architecture i386 && \
apt-get update && \
apt-get install -y xinetd libc6:i386 libstdc++6:i386
# 复制题目文件
COPY bin/pwn /home/ctf/
COPY flag /home/ctf/
COPY ctf.xinetd /etc/xinetd.d/ctf
COPY start.sh /start.sh
# 设置权限
RUN chmod 755 /home/ctf/pwn && \
chmod 644 /home/ctf/flag && \
chmod 755 /start.sh
# 启动服务
CMD ["/start.sh"]
四、项目结构规范
项目根目录/
├── docker/ # 容器构建相关资源
├── Dockerfile # 镜像构建定义文件
├── bin/
│ └── pwn # 编译好的漏洞程序
├── ctf.xinetd # xinetd 服务配置文件
├── docker-compose.yml # (可选)Compose 管理文件
├── flag # 静态 flag 文件
├── flag.sh # 动态生成 flag 的脚本
└── start.sh # 容器启动初始化脚本
五、编译参数详解
1. NX(No-eXecute)保护
-z execstack:关闭 NX,栈可执行-z noexecstack(默认):开启 NX,栈不可执行
2. Stack Canary(栈保护)
-fno-stack-protector:关闭 Canary-fstack-protector:部分函数保护-fstack-protector-all:全函数保护
3. PIE 与 ASLR
-no-pie:关闭 PIE,地址固定-pie:开启 PIE,地址随机化
4. RELRO(重定位只读)
-z norelro:关闭 RELRO-z lazy:部分 RELRO(默认)-z now:完全 RELRO
5. 其他参数
-m32:编译为 32 位程序-s:去除符号表
六、题目开发流程
开发原则
遵循"先本地、后远程"的原则:
- 在本地环境中完整打通利用链
- 确保漏洞可触发、Flag 能正常返回
- 部署到 Docker 容器中进行远程测试
题目类型示例
- 签到题:基础漏洞利用
- 格式化字符串漏洞
- ret2libc 攻击
- 栈迁移技术
七、常见问题与解决方案
1. 缺少相关库问题
现象:程序无法正常运行,尤其是 32 位二进制文件
解决方法:
# 使用 ldd 检查依赖
ldd bin/pwn
# 在 Dockerfile 中显式安装缺失的库
RUN apt-get install -y <缺失的库名>:i386
2. 静态链接陷阱
问题:避免使用 gcc -static 进行静态编译
原因:
- 静态链接只会包含实际被调用的函数代码
- 关键函数(如 system、execve 等)可能被优化掉
- 导致本地能打通但远程利用失败
3. "not found" 错误
现象:连接题目时程序报错 "not found"
根本原因:xinetd 运行环境中删除了非必要系统目录,导致共享库缺失
解决方案:确保 Dockerfile 中包含所有必要的运行时库
八、安全注意事项
- 权限设置:确保程序运行在低权限用户下
- 文件权限:合理设置 flag 文件和其他敏感文件的访问权限
- 环境隔离:利用 Docker 的隔离特性防止服务被恶意利用
- 资源限制:通过 Docker 限制内存、CPU 等资源使用
九、测试验证
部署完成后必须进行完整测试:
- 本地漏洞利用测试
- 远程连接测试
- Flag 获取验证
- 稳定性压力测试
通过以上系统性的设计和部署流程,可以创建出安全、稳定且符合 CTF 规范的 Pwn 题目环境。