pwn的部分堆题复现

1. hitcontraining_heapcreator

保护机制检查

主函数分析

漏洞点分析

查看各个函数,发现漏洞在edit函数:

可以看到函数可以多覆盖一位,存在off-by-one漏洞。edit时可以多写入一个字节,通过溢出覆盖下一个chunk的size字段。

利用思路

  • 程序存在复用机制,如果chunk都处于inuse状态,上一个chunk可以使用到下一个chunk的prev_size
  • 通过溢出修改下一个chunk的size字段
  • 修改size为0x41后free,可以一次性free掉两个堆块
  • 重新申请0x30大小的堆块,完成堆内容堆块和堆指针堆块的互换
  • 修改堆指针堆块内容泄露libc版本(通过free_got)
  • 将free函数跳转为system函数
  • free掉heap0触发system(“/bin/sh”)获取shell

调试过程

创建两个堆块:

修改size为0x41:

free后重新申请:


查看libc偏移:

EXP代码

获取shell


2. hitcon2014_stkof

保护机制检查

主函数分析


功能分析

选择1(创建堆块):

  • 创建堆块并打印内容
  • 将堆块的data指针存放到dword_602100地址

选择2(编辑堆块):

  • 可输入任意大小,存在堆溢出漏洞

选择3(释放堆块):

  • free函数,指针清零,无UAF漏洞

选择4:

  • 无实际功能

利用思路

创建3个堆块进行观察:

发现chunk2和chunk3相邻,可以通过edit修改chunk2内容溢出到chunk3:

利用条件:

  • 关闭PIE保护
  • 存在堆溢出漏洞
  • 知道堆块指针存放位置

利用步骤:

  1. 在chunk2的data部分伪造fake_chunk
  2. 通过堆溢出修改chunk3的prev_size和size的P标志位
  3. 释放chunk3时触发向前合并,触发unlink
  4. 泄露libc版本并修改函数地址

详细解释


3. hitcontraining_uaf

保护机制检查

主函数分析

功能分析

add函数:

  • 创建两个堆块
  • 第一个堆块存储puts函数和content内容地址
  • 第二个堆块存储content内容

delete函数:

  • 存在UAF漏洞,指针未清零

print函数:

  • 跳转到第一个堆块存储的puts函数地址

magic函数(后门):

  • 直接获取shell的后门函数

利用思路

创建两个堆块观察:

利用步骤:

  1. 利用UAF漏洞和堆块复用机制
  2. free掉堆块后创建较小堆块复用之前的堆块结构
  3. 修改第一个堆块的puts函数地址为magic函数地址
  4. 调用print(0)触发magic函数获取shell

调试过程

修改puts地址为magic地址:

注意: 需要print第一个堆块(print 0)来触发


本文到此结束!


pwn的部分堆题复现
http://x1nglu0.github.io/2025/10/28/pwn的部分堆题复现/
作者
x1nglu0
发布于
2025年10月28日
许可协议