You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

缓冲区溢出类型判定:栈溢出还是堆溢出?如何进行漏洞利用?

漏洞类型判定与利用思路分析

1. 漏洞类型明确

这段代码的漏洞属于堆溢出,判定依据:

  • password_buffer 是通过 malloc(16) 在堆上分配的内存区域,并非栈上的局部数组
  • strcpy(password_buffer, password) 未做长度校验,当输入的password长度超过16字节时,会溢出堆缓冲区,破坏堆内存的管理结构或相邻堆块

2. 崩溃与利用失败的核心原因

输入1064字节触发崩溃,但无法通过JMP ESP执行shellcode,本质是堆溢出和栈溢出的利用逻辑完全不同:

  • 栈溢出的核心是直接覆盖函数返回地址,借助JMP ESP跳转执行栈上的shellcode;但堆溢出的目标是破坏堆的管理元数据(比如chunk的size标志、fd/bk指针等),而非直接覆盖返回地址
  • 你输入的1064字节只是无差别破坏了大量堆内存,触发内存校验错误导致崩溃,没有精准控制堆结构来构建代码执行的条件

3. 可行的堆溢出利用方向

针对这类场景,可以尝试以下利用思路:

  • 相邻堆块覆盖:dept是紧随password_buffer分配的10字节堆块,先溢出password_buffer覆盖dept的堆块元数据,后续对dept的操作(如free、写入)可能成为触发点
  • Fastbin攻击:如果程序使用glibc的malloc实现,16字节和10字节的块都属于fastbin范围,可通过溢出修改fastbin的fd指针,让后续malloc返回可控内存地址(比如GOT表、函数返回地址区域)
  • 触发UAF(Use-After-Free):若程序后续存在对password_buffer或dept的free操作,溢出破坏堆结构后可能导致UAF,进而控制代码流

4. 调试优化建议

  • 用调试器(如gdb)查看堆内存布局,确认password_buffer和dept的地址、堆块元数据的具体位置
  • 逐步缩短输入长度,找到刚好能破坏堆元数据但不直接崩溃的输入大小,观察堆结构的变化规律
  • 重点追踪程序后续对堆内存的操作(是否有free、重新malloc、对dept的写入等),这些操作往往是堆溢出利用的关键触发点

内容的提问来源于stack exchange,提问作者MrDoufy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:27:18