阿里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

漏洞利用

  1. 控制全局变量: 覆盖local_offset_val后会赋值给g_robust_offset
  2. 利用Robust List: 内核在线程退出时会修改g_robust_offset指向的内存
  3. 信息泄露: 利用SNAPSHOT功能发送超过缓冲区大小的数据,泄露栈数据和libc地址
  4. 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[];       // 用户数据
};

利用思路

  1. 堆溢出: 通过负长度触发整数溢出,分配小chunk但写入大量数据
  2. 控制数据结构: 溢出修改note的content_ptr指向其他note的结构体
  3. 任意地址写: 通过edit功能实现任意地址写入
  4. 泄露地址: 利用unsorted bin泄露libc地址
  5. ROP攻击: 修改返回地址执行system("/bin/sh")

GPT?Pwn?

程序特点

  • 混合PWN和LLM Jailbreak技术
  • 包含大量混淆代码和数学计算干扰分析
  • AI会对部分输入进行安全过滤

漏洞分析

vuln_func()函数中使用gets()存在栈溢出,但由于缺少pop rdi; ret等gadget,需要特殊利用。

利用技巧

  1. AI注入: 使用特殊标记<|im_end|><|im_start|>绕过AI过滤
  2. 寄存器残留: 利用gets()调用后RDI寄存器的残留值泄露libc地址
  3. 多次调用: 通过多次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\

利用链

  1. 创建VHDX虚拟磁盘
  2. 连接Patcher驱动设置feature flag
  3. 构造超长NT路径(约65KB)
  4. 触发漏洞导致BSOD
  5. Patcher的BugCheck Callback检测到特定崩溃地址
  6. 触发hypercall创建.success文件

alifs (FUSE文件系统)

程序功能

支持Copy-on-Write的内存文件系统,通过FUSE框架运行。

漏洞分析

  1. CoW异常处理: 在cow_write()中,当refcnt>1时需要CoW,但如果vector_resize抛出std::bad_alloc异常,map指针不会更新
  2. UAF形成: 异常后原DataBlock的refcnt已被减1,后续unlink可将其释放,但文件描述符仍持有旧指针
  3. 类型混淆: 通过创建新文件分配相同内存,伪造DataBlock结构实现任意地址读写

利用链

  1. 创建共享文件触发CoW异常
  2. 释放原DataBlock形成UAF
  3. 创建新文件分配相同内存
  4. 伪造DataBlock控制读写范围
  5. 泄露libc和堆地址
  6. 修改fuse_operations函数指针
  7. 将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漏洞

  1. 栈溢出: TLS线程处理函数中存在无边界检查的栈复制
  2. SSL劫持: 溢出覆盖ssl_obj指针,控制程序执行流
  3. 堆喷射: 通过大块分配在内存中部署shellcode

完整利用链

  1. 通过message.cgi写入Python exp脚本
  2. 利用ld-linux RCE执行脚本
  3. 连接echo_server进行堆喷
  4. 创建TLS线程触发栈溢出
  5. 覆盖ssl_obj劫持SSL_accept
  6. 执行shellcode读取flag
  7. 通过message.cgi回传结果

The Wolf of Wall Street

系统架构

  • 客户端(cli)和服务器(srv)chroot隔离
  • srv以uid=666运行,可读flag
  • cli以uid=888运行,需要通过漏洞提权

客户端漏洞

  1. 逻辑绕过: install_script功能检查marketValueCached > 0 && debugModeEnabled
  2. Lua沙箱逃逸: 开启os库,可直接执行系统命令
  3. 信息控制: 通过asset_resp响应可控制marketValueCached

服务器漏洞

  1. TOCTOU: 交易函数中解锁-日志-重新加锁的竞争窗口
  2. ETF成分修改: 在竞争窗口中修改ETF成分,低成本买入高价值资产
  3. 资金刷取: 利用竞争条件积累资金超过233333门槛

Lua字节码沙箱逃逸

  1. 地址泄露: 利用OP_FORLOOP类型混淆泄露对象地址
  2. TValue伪造: 通过OP_CLOSURE的upvalue捕获机制伪造任意TValue
  3. 任意地址读: 伪造TString对象读取任意内存
  4. 全局表恢复: 获取沙箱外的string/io库
  5. 内存读写: 通过io库读写/proc/self/mem

完整利用链

  1. 客户端触发debug模式并获取持仓市值
  2. 执行Lua脚本获得本地shell
  3. 利用TOCTOU漏洞刷取资金
  4. 调用install_quant提交恶意Lua字节码
  5. 沙箱逃逸获取完整Lua环境
  6. 执行shellcode进行chroot逃逸
  7. 读取flag并通过socket传回

总结

本次CTF题目涵盖多个技术领域:

  1. 多线程安全: SyncVault展示了多线程环境下的栈溢出和Robust List利用
  2. 堆管理器逆向: PwnChunk需要深入理解自定义堆分配器
  3. AI与PWN结合: GPT?Pwn?创新性地结合了LLM Jailbreak技术
  4. 内核驱动漏洞: 1day考察Windows内核漏洞分析和利用
  5. 文件系统安全: alifs涉及FUSE文件系统和CoW机制的安全问题
  6. 权限隔离突破: easy cgi和The Wolf of Wall Street都需要多阶段攻击链

这些题目不仅考察传统PWN技术,还涉及操作系统内核、文件系统、沙箱逃逸等高级话题,体现了现代漏洞利用的发展趋势。

相似文章
相似文章
 全屏