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保护
- 存在堆溢出漏洞
- 知道堆块指针存放位置
利用步骤:
- 在chunk2的data部分伪造fake_chunk
- 通过堆溢出修改chunk3的prev_size和size的P标志位
- 释放chunk3时触发向前合并,触发unlink
- 泄露libc版本并修改函数地址
详细解释

3. hitcontraining_uaf
保护机制检查

主函数分析

功能分析
add函数:
- 创建两个堆块
- 第一个堆块存储puts函数和content内容地址
- 第二个堆块存储content内容
delete函数:
- 存在UAF漏洞,指针未清零
print函数:
- 跳转到第一个堆块存储的puts函数地址
magic函数(后门):
- 直接获取shell的后门函数
利用思路
创建两个堆块观察:
利用步骤:
- 利用UAF漏洞和堆块复用机制
- free掉堆块后创建较小堆块复用之前的堆块结构
- 修改第一个堆块的puts函数地址为magic函数地址
- 调用print(0)触发magic函数获取shell
调试过程
修改puts地址为magic地址:

注意: 需要print第一个堆块(print 0)来触发
本文到此结束!
pwn的部分堆题复现
      http://x1nglu0.github.io/2025/10/28/pwn的部分堆题复现/