欲买桂花同载酒,终不似 少年游。
堆结构图如下:
图-堆概略图
图-堆详细图
在进行正常的申请内存时,系统将符合的空间结点进行外排,将剩余的前后结点进行相连
//此处node可以替换为上图的B结点
node->bp->fp = node->fp
node->fp->bp = node->bp
根据堆的详细图来看有三个空间节点,从左到右依次定义为A、B、C
-
如果我们在申请空间时,函数自动为我们分配为B空间,那么就会将A空间与C空间相连
-
而在对B空间进行数据的拷贝操作过程中,多拷贝十六字节的数据,对fp和bp进行污染,将fp设定为任意值,bp设定为任意地址
-
-
再次进行内存分配时,如果是将C空间分配出去,则执行如下语句,就是将两个不相关的空间进行连接
//此处的node当做上图的C结点
node->bp->fp = node->value
node->fp->bp = node->where
-
如果bp指向的任意地址是一个函数,而任意值指向的空间为恶意代码,那么就相当于更改了函数的原本功能
-
图-第二次调用malloc之前
-
如果再次执行函数的话,那么就达到了执行恶意代码的目的
原文始发于微信公众号(0x00实验室):缓冲区溢出 --- 堆溢出原理分析 | 恶意代码
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论