缓冲区溢出类型判定:栈溢出还是堆溢出?如何进行漏洞利用?
漏洞类型判定与利用思路分析
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
相关产品推荐
相关产品推荐

