2024楚慧杯决赛pwn方向题解
字数 1611 2025-08-22 12:23:24
2024楚慧杯决赛PWN方向题解与教学文档
1. babyheap题解(glibc 2.23)
漏洞分析
- 存在Use After Free (UAF)漏洞
- 目标:利用UAF漏洞修改
__malloc_hook为one_gadget
利用过程
- 常规利用UAF漏洞控制堆内存
- 尝试将
__malloc_hook修改为one_gadget - 调试发现one_gadget条件不满足(寄存器值不符合要求)
- 解决方案:利用
__realloc_hook调整栈帧- 先设置
__realloc_hook为调整栈帧的gadget - 再设置
__malloc_hook为realloc函数中的某个位置
- 先设置
关键点
- 需要理解
__realloc_hook和__malloc_hook的调用顺序 - 通过调整栈帧创造满足one_gadget执行的条件
2. Messy_heap题解(glibc 2.31)
程序保护
- 开启沙盒保护,禁用execve
- 需要采用ORW(open-read-write)方式获取flag
漏洞分析
-
add函数:
- 可申请0xf个堆块
- 堆块大小最大为0x90(在tcache bins范围内)
-
free函数:
- 指针未置零,存在UAF漏洞
-
edit函数:
- 只能编辑0x38大小的内容
利用思路
- 由于沙盒限制,采用setcontext+ORW方式
- glibc 2.31中利用setcontext需要控制rdx寄存器
- 寻找通过rdi间接控制rdx的gadget
详细利用步骤
-
ROP链构造:
- 将完整ROP链分散写入多个堆块(0、1、2号堆块)
- 由于edit限制(0x38字节),需要分阶段写入
-
分阶段利用:
- 第一阶段:构造read函数将读入大小修改至0x200
- 第二阶段:读入完整ORW链
-
关键gadget:
mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr [rdx + 0x20] -
ORW构造:
- 通过多个堆块组合构造完整的open-read-write链
- 需要精确计算每个堆块中的内容
3. Sequence table题解
程序特点
- 表面是堆题,实际是伪堆题
- 禁用execve和execveat
- 存在数组越界漏洞
漏洞分析
-
show函数:
- 输入数字与a2(=0)比较
- 输入负数可实现数组越界
- 通过精心构造的负数可控制rsi寄存器
-
地址泄露:
- 输入-1:泄露
_IO_2_1_stdout_地址 - 输入-2:泄露
prctl@got.plt地址,计算PIE基址
- 输入-1:泄露
-
add函数:
- 可进行三次读入
- 读入地址连续(bss段)
利用步骤
- 通过多次free操作将读入地址上调到GOT段
- 观察程序调用exit时rsp指向info
- 修改exit的GOT表项控制程序流
- 利用IDA中的what函数作为跳板
- 构造ROP链执行read函数
- 二次读入ORW链获取shell
关键点
- 利用数组越界精确控制内存读写
- 通过修改exit的GOT表项劫持控制流
- 分阶段构造ROP链
4. fix messy_baby修补方案
漏洞修补
- 主要漏洞:UAF(指针未置零)
- 修复方案:在free操作后将指针置零
额外技术点
- 在eh_frame段编写汇编
- 需要先用010editor给eh_frame段777权限
- 汇编编写要点:
- 确保与现有代码的兼容性
- 注意函数调用约定
- 正确处理堆指针
总结与教学要点
-
不同glibc版本的利用差异:
- 2.23:可直接修改hook
- 2.31:需要更复杂的控制流劫持
-
沙盒绕过技术:
- ORW的标准构造方法
- 分阶段写入的技术
-
伪堆题的识别:
- 表面是堆操作,实际存在其他漏洞
- 数组越界的利用技巧
-
高级利用技术:
- 通过寄存器间接控制
- GOT表项的精确定位和修改
- 多阶段ROP链构造
-
漏洞修补:
- UAF的标准修复方法
- 敏感操作后的指针清理
通过这三个题目的分析和利用,可以全面掌握现代PWN题的各种高级利用技术,特别是在沙盒保护和最新glibc版本下的利用方法。