什么叫堆溢出在线 0

来源:百度知道 编辑:UC知道 时间:2024/05/27 06:32:21
我打开某个网站的时候,弹出一个对话匡说是微软因特探险家提示;堆溢出在线:0,我想请问下这是什么意思,希望答案详细点,谢谢!!

其实堆溢出与格式串溢出特像,就是“一个format strings“的bug可以使往任何数据写到任何地方
你的症状是因为你浏览的页面的脚本中的函数出现了过度的递归调用,比如递归了4096次,然后就溢出了

一、堆溢出后的后果;
现在的系统管理堆,为了查询的高效快速,一般都使用的双向链表结构。我们来看
双向链表管理的时候的删除操作。*a,*b,*p1,*p2,*c,*d都是指针,考虑双向链表,
a,b--->p1,p2--->c,d,其中由双向链表有*b=p1,*p1=a,*p2=c。如果是空闲内存链表,
那么申请使用p1、p2指向的内存,或者如果是使用内存链表,释放p1、p2指向的内存,
都会从这个链表中删除p1,p2。删除后的链表是a,b--->c,d,应该有内存改写操作:
*b=c,*c=a。这时代码是经过链表检索从a,b得到的p1,p2,一般为了高效等就不会记忆
a,b,因为双向链表就是为了从一个结点可以方便的得到上级和下级结点。所以那两条
内存操作都将会转换成p1、p2相关的操作。根据前面得到的信息,经过简单的代换就可
以得到我们需要的代码:

*b=p1,*p1=a,*p2=c,b=a+1
*b=c--->*(a+1)=c--->*(*p1+1)=*p2
*c=a--->*(*p2)=*p1
两次指针,可能看起来不是很习惯,再把*p1记成p1,*p2记成p2,那么就有:
*p2=p1
*(p1+1)=p2
这就是堆溢出后导致的两个写内存操作,以后考虑堆溢出,不考虑细节的话基本上就可
以用这两条代码代替。这时的p1、p2已经不是指那链表的位置了,而是指里面的内容。
二、利用。
要利用堆溢出,就考虑上面总结的两条代码的利用就是了。
1、改写内存参数,直接利用。可以改写重要变量,还有一个字符串的长度,格式
串等,让起改写后再产生别的溢出等。这要改写一般只能改写数据段里面的东西,因为
这位置相对固定并且可写。
2、改写函数指针性质的调用入口等。这个要写远