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

利用过程

  1. 常规利用UAF漏洞控制堆内存
  2. 尝试将__malloc_hook修改为one_gadget
  3. 调试发现one_gadget条件不满足(寄存器值不符合要求)
  4. 解决方案:利用__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

漏洞分析

  1. add函数

    • 可申请0xf个堆块
    • 堆块大小最大为0x90(在tcache bins范围内)
  2. free函数

    • 指针未置零,存在UAF漏洞
  3. edit函数

    • 只能编辑0x38大小的内容

利用思路

  1. 由于沙盒限制,采用setcontext+ORW方式
  2. glibc 2.31中利用setcontext需要控制rdx寄存器
  3. 寻找通过rdi间接控制rdx的gadget

详细利用步骤

  1. ROP链构造

    • 将完整ROP链分散写入多个堆块(0、1、2号堆块)
    • 由于edit限制(0x38字节),需要分阶段写入
  2. 分阶段利用

    • 第一阶段:构造read函数将读入大小修改至0x200
    • 第二阶段:读入完整ORW链
  3. 关键gadget

    mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr [rdx + 0x20]
    
  4. ORW构造

    • 通过多个堆块组合构造完整的open-read-write链
    • 需要精确计算每个堆块中的内容

3. Sequence table题解

程序特点

  • 表面是堆题,实际是伪堆题
  • 禁用execve和execveat
  • 存在数组越界漏洞

漏洞分析

  1. show函数

    • 输入数字与a2(=0)比较
    • 输入负数可实现数组越界
    • 通过精心构造的负数可控制rsi寄存器
  2. 地址泄露

    • 输入-1:泄露_IO_2_1_stdout_地址
    • 输入-2:泄露prctl@got.plt地址,计算PIE基址
  3. add函数

    • 可进行三次读入
    • 读入地址连续(bss段)

利用步骤

  1. 通过多次free操作将读入地址上调到GOT段
  2. 观察程序调用exit时rsp指向info
  3. 修改exit的GOT表项控制程序流
  4. 利用IDA中的what函数作为跳板
  5. 构造ROP链执行read函数
  6. 二次读入ORW链获取shell

关键点

  • 利用数组越界精确控制内存读写
  • 通过修改exit的GOT表项劫持控制流
  • 分阶段构造ROP链

4. fix messy_baby修补方案

漏洞修补

  • 主要漏洞:UAF(指针未置零)
  • 修复方案:在free操作后将指针置零

额外技术点

  1. 在eh_frame段编写汇编
    • 需要先用010editor给eh_frame段777权限
  2. 汇编编写要点:
    • 确保与现有代码的兼容性
    • 注意函数调用约定
    • 正确处理堆指针

总结与教学要点

  1. 不同glibc版本的利用差异

    • 2.23:可直接修改hook
    • 2.31:需要更复杂的控制流劫持
  2. 沙盒绕过技术

    • ORW的标准构造方法
    • 分阶段写入的技术
  3. 伪堆题的识别

    • 表面是堆操作,实际存在其他漏洞
    • 数组越界的利用技巧
  4. 高级利用技术

    • 通过寄存器间接控制
    • GOT表项的精确定位和修改
    • 多阶段ROP链构造
  5. 漏洞修补

    • UAF的标准修复方法
    • 敏感操作后的指针清理

通过这三个题目的分析和利用,可以全面掌握现代PWN题的各种高级利用技术,特别是在沙盒保护和最新glibc版本下的利用方法。

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 : ORW构造 : 通过多个堆块组合构造完整的open-read-write链 需要精确计算每个堆块中的内容 3. Sequence table题解 程序特点 表面是堆题,实际是伪堆题 禁用execve和execveat 存在数组越界漏洞 漏洞分析 show函数 : 输入数字与a2(=0)比较 输入负数可实现数组越界 通过精心构造的负数可控制rsi寄存器 地址泄露 : 输入-1:泄露 _IO_2_1_stdout_ 地址 输入-2:泄露 prctl@got.plt 地址,计算PIE基址 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版本下的利用方法。