阿里CTF2026 pwn 部分题解及赛后复现
字数 3516
更新时间 2026-03-10 12:01:22
阿里CTF2026 PWN 题目详解与复现
前言
本次阿里CTF比赛题目质量上乘,涉及多线程、堆管理、内核驱动、沙箱逃逸等多种技术,展现了现代PWN题的深度和广度。以下是部分PWN题目的详细分析和解题思路。
SyncVault
程序分析
- 架构: amd64-64-little
- 保护机制: Full RELRO, Stack Canary, NX, PIE, FORTIFY, SHSTK, IBT
- 程序类型: 多线程TCP服务器
漏洞分析
程序在client_handler函数中存在栈溢出漏洞:
_BYTE stack_buffer[48]; // 位于 rbp-0x11C8
__int64 local_offset_val; // 位于 rbp-0x1198
两者在栈上相邻,距离为0x30(48字节)。当程序通过SETSYNC设置读取长度为56字节时,向stack_buffer写入超过48字节的数据会覆盖local_offset_val。
漏洞利用
- 控制全局变量: 覆盖
local_offset_val后会赋值给g_robust_offset - 利用Robust List: 内核在线程退出时会修改
g_robust_offset指向的内存 - 信息泄露: 利用
SNAPSHOT功能发送超过缓冲区大小的数据,泄露栈数据和libc地址 - ROP利用: 通过泄露的地址构造ROP链执行system("/bin/sh")
利用步骤
# 1. 设置SYNC长度
# 2. 触发栈溢出覆盖local_offset_val
# 3. 修改全局配置变量
# 4. 通过SNAPSHOT泄露canary和libc地址
# 5. 构造ROP链
# 6. 通过ECHO触发执行
PwnChunk
程序分析
- 架构: amd64-64-little
- 保护机制: Full RELRO, Stack Canary, NX, PIE, FORTIFY, SHSTK, IBT
- 程序功能: 自定义堆分配器的用户留言系统
漏洞分析
在create_profile()函数中,读取"个人简介长度"时未检查负数:
input_bio_len = read_long_input();
*(_QWORD *)(profile_ptr_temp + 104) = custom_malloc(input_bio_len + 1);
当input_bio_len = -2时,input_bio_len + 1 = -1(0xFFFFFFFFFFFFFFFF),产生整数溢出,导致分配极小的堆块,后续写入时造成堆溢出。
堆管理结构
struct Chunk {
int32_t size; // 当前块大小
int32_t unused_pad; // 填充
struct Chunk *prev; // 前向指针
struct Chunk *next; // 后向指针
char user_data[]; // 用户数据
};
利用思路
- 堆溢出: 通过负长度触发整数溢出,分配小chunk但写入大量数据
- 控制数据结构: 溢出修改note的content_ptr指向其他note的结构体
- 任意地址写: 通过edit功能实现任意地址写入
- 泄露地址: 利用unsorted bin泄露libc地址
- ROP攻击: 修改返回地址执行system("/bin/sh")
GPT?Pwn?
程序特点
- 混合PWN和LLM Jailbreak技术
- 包含大量混淆代码和数学计算干扰分析
- AI会对部分输入进行安全过滤
漏洞分析
vuln_func()函数中使用gets()存在栈溢出,但由于缺少pop rdi; ret等gadget,需要特殊利用。
利用技巧
- AI注入: 使用特殊标记
<|im_end|>和<|im_start|>绕过AI过滤 - 寄存器残留: 利用
gets()调用后RDI寄存器的残留值泄露libc地址 - 多次调用: 通过多次
gets()调用控制程序流程
利用步骤
# 1. 构造特殊padding使AI输出乱码
# 2. 第一次gets()读取垃圾数据
# 3. 第二次gets()触发libc地址泄露
# 4. 计算libc基址
# 5. 构造ret2libc payload
1day (Windows内核驱动漏洞)
环境信息
- 目标: Windows 11 vhdmp.sys驱动
- 漏洞类型: 整数溢出导致的堆溢出
- 利用要求: 通过驱动漏洞触发QEMU hypercall
漏洞分析
在VhdmpiCTLogMirroringConstructMirrorLogFileName函数中:
totalLength = (USHORT)(mirrorDirLength + ctlogFileNameLength);
allocatedBuffer = ExAllocatePool2(..., totalLength, ...);
memmove(allocatedBuffer, ..., mirrorDirLength);
totalLength被截断为USHORT(16位),但memmove使用原始的大长度,导致堆溢出。
利用限制
Windows路径长度默认限制260字符,需要使用NT路径格式:
- Win32路径:
C:\Users\test\ - NT路径:
\Device\HarddiskVolume3\Users\test\
利用链
- 创建VHDX虚拟磁盘
- 连接Patcher驱动设置feature flag
- 构造超长NT路径(约65KB)
- 触发漏洞导致BSOD
- Patcher的BugCheck Callback检测到特定崩溃地址
- 触发hypercall创建.success文件
alifs (FUSE文件系统)
程序功能
支持Copy-on-Write的内存文件系统,通过FUSE框架运行。
漏洞分析
- CoW异常处理: 在
cow_write()中,当refcnt>1时需要CoW,但如果vector_resize抛出std::bad_alloc异常,map指针不会更新 - UAF形成: 异常后原DataBlock的refcnt已被减1,后续
unlink可将其释放,但文件描述符仍持有旧指针 - 类型混淆: 通过创建新文件分配相同内存,伪造DataBlock结构实现任意地址读写
利用链
- 创建共享文件触发CoW异常
- 释放原DataBlock形成UAF
- 创建新文件分配相同内存
- 伪造DataBlock控制读写范围
- 泄露libc和堆地址
- 修改fuse_operations函数指针
- 将symlink替换为system触发命令执行
easy cgi
环境架构
- 两阶段攻击: Web RCE + 本地提权
- 权限分离:
- CGI程序以www-data运行
- echo_server以ctf运行(可读flag)
- flag权限: root:ctf 740
Web阶段漏洞
Apache配置AddHandler cgi-script *使cgi-bin下所有文件都可作为CGI执行,包括ld-linux-x86-64.so.2。
动态链接器可通过URL参数执行任意命令:
/cgi-bin/ld-linux-x86-64.so.2?/bin/bash+/tmp/command
echo_server漏洞
- 栈溢出: TLS线程处理函数中存在无边界检查的栈复制
- SSL劫持: 溢出覆盖ssl_obj指针,控制程序执行流
- 堆喷射: 通过大块分配在内存中部署shellcode
完整利用链
- 通过message.cgi写入Python exp脚本
- 利用ld-linux RCE执行脚本
- 连接echo_server进行堆喷
- 创建TLS线程触发栈溢出
- 覆盖ssl_obj劫持SSL_accept
- 执行shellcode读取flag
- 通过message.cgi回传结果
The Wolf of Wall Street
系统架构
- 客户端(cli)和服务器(srv)chroot隔离
- srv以uid=666运行,可读flag
- cli以uid=888运行,需要通过漏洞提权
客户端漏洞
- 逻辑绕过:
install_script功能检查marketValueCached > 0 && debugModeEnabled - Lua沙箱逃逸: 开启os库,可直接执行系统命令
- 信息控制: 通过asset_resp响应可控制
marketValueCached
服务器漏洞
- TOCTOU: 交易函数中解锁-日志-重新加锁的竞争窗口
- ETF成分修改: 在竞争窗口中修改ETF成分,低成本买入高价值资产
- 资金刷取: 利用竞争条件积累资金超过233333门槛
Lua字节码沙箱逃逸
- 地址泄露: 利用OP_FORLOOP类型混淆泄露对象地址
- TValue伪造: 通过OP_CLOSURE的upvalue捕获机制伪造任意TValue
- 任意地址读: 伪造TString对象读取任意内存
- 全局表恢复: 获取沙箱外的string/io库
- 内存读写: 通过io库读写/proc/self/mem
完整利用链
- 客户端触发debug模式并获取持仓市值
- 执行Lua脚本获得本地shell
- 利用TOCTOU漏洞刷取资金
- 调用install_quant提交恶意Lua字节码
- 沙箱逃逸获取完整Lua环境
- 执行shellcode进行chroot逃逸
- 读取flag并通过socket传回
总结
本次CTF题目涵盖多个技术领域:
- 多线程安全: SyncVault展示了多线程环境下的栈溢出和Robust List利用
- 堆管理器逆向: PwnChunk需要深入理解自定义堆分配器
- AI与PWN结合: GPT?Pwn?创新性地结合了LLM Jailbreak技术
- 内核驱动漏洞: 1day考察Windows内核漏洞分析和利用
- 文件系统安全: alifs涉及FUSE文件系统和CoW机制的安全问题
- 权限隔离突破: easy cgi和The Wolf of Wall Street都需要多阶段攻击链
这些题目不仅考察传统PWN技术,还涉及操作系统内核、文件系统、沙箱逃逸等高级话题,体现了现代漏洞利用的发展趋势。
相似文章
相似文章