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:去除符号表

六、题目开发流程

开发原则

遵循"先本地、后远程"的原则:

  1. 在本地环境中完整打通利用链
  2. 确保漏洞可触发、Flag 能正常返回
  3. 部署到 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 中包含所有必要的运行时库

八、安全注意事项

  1. 权限设置:确保程序运行在低权限用户下
  2. 文件权限:合理设置 flag 文件和其他敏感文件的访问权限
  3. 环境隔离:利用 Docker 的隔离特性防止服务被恶意利用
  4. 资源限制:通过 Docker 限制内存、CPU 等资源使用

九、测试验证

部署完成后必须进行完整测试:

  1. 本地漏洞利用测试
  2. 远程连接测试
  3. Flag 获取验证
  4. 稳定性压力测试

通过以上系统性的设计和部署流程,可以创建出安全、稳定且符合 CTF 规范的 Pwn 题目环境。

CTF Pwn 题目设计指南 一、前言 当前大多数动态 Flag 的 Pwn 题目都基于开源项目 ctf_ xinetd 进行部署,该项目通过 xinetd 和 Docker 技术,将题目运行在低权限、隔离良好的环境中,有效提升了服务的安全性与稳定性。 项目地址:https://github.com/Eadom/ctf_ xinetd 二、Docker 环境构建 安装 Docker 使用官方提供的安装脚本,推荐通过国内镜像源加速下载。 基本构建命令 常用 Docker 命令 三、Dockerfile 配置 32位程序特殊处理 32位程序运行需要显式启用 i386 架构并安装相应的 32 位兼容库。 典型 Dockerfile 示例 四、项目结构规范 五、编译参数详解 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 位二进制文件 解决方法 : 2. 静态链接陷阱 问题 :避免使用 gcc -static 进行静态编译 原因 : 静态链接只会包含实际被调用的函数代码 关键函数(如 system、execve 等)可能被优化掉 导致本地能打通但远程利用失败 3. "not found" 错误 现象 :连接题目时程序报错 "not found" 根本原因 :xinetd 运行环境中删除了非必要系统目录,导致共享库缺失 解决方案 :确保 Dockerfile 中包含所有必要的运行时库 八、安全注意事项 权限设置 :确保程序运行在低权限用户下 文件权限 :合理设置 flag 文件和其他敏感文件的访问权限 环境隔离 :利用 Docker 的隔离特性防止服务被恶意利用 资源限制 :通过 Docker 限制内存、CPU 等资源使用 九、测试验证 部署完成后必须进行完整测试: 本地漏洞利用测试 远程连接测试 Flag 获取验证 稳定性压力测试 通过以上系统性的设计和部署流程,可以创建出安全、稳定且符合 CTF 规范的 Pwn 题目环境。