基于随机算法堆溢出防范策略

基于随机算法堆溢出防范策略

ID:43963441

大小:38.68 KB

页数:6页

时间:2019-10-17

基于随机算法堆溢出防范策略_第1页
基于随机算法堆溢出防范策略_第2页
基于随机算法堆溢出防范策略_第3页
基于随机算法堆溢出防范策略_第4页
基于随机算法堆溢出防范策略_第5页
资源描述:

《基于随机算法堆溢出防范策略》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、基于随机算法堆溢出防范策略摘要:缓冲区溢出攻击是一种攻击计算机系统的手段,本文针对缓冲区溢出的堆溢出问题进行了探究。简述了当前堆溢出的原理和防范方法,阐述堆的数据结构和堆溢出的攻击原理。通过堆块的分配策略,以及堆块本身的特点,提出一种随机分配堆块的方法。关键词:缓冲区溢出;堆溢出;随机分配中图分类号:TP393.08文献标识码:A文章编号:1007-9599(2012)13-0000-02一、堆溢出的攻击原理和防范(一)堆的溢出攻击原理[1]堆是在存储器中开辟的一段区域,这段区域经常被应用程序利用,而且在程序

2、运行的时候被动态分配。堆的溢出是指在堆中缓冲区写数据时,数据超出了该缓冲区所能容纳的空间。这时,临近区域的内容被超出的部分覆盖,超出的部分被破坏者利用,改写了一些危险的代码。最后,这些危险代码改写了目标程序。堆的溢出利用,有两种情况:第一种情况是MattConover等提出的堆利用方法,这种利用方法是通过溢出堆覆盖了相邻堆块数据、堆管理数据或指针值;第二种是利用堆结构本身的特点。第一种方法是被利用的比较多的方法,我们这里主要关注第一种堆溢出利用方法。第一种方法的实现原理如图1所示,在堆管理数据的两侧分别动态分

3、配了内存块M和N,当向内存块M中输入数据时,如果超过了M的边界,堆管理数据的内容就会被覆盖掉,导致溢出的产生。如果超过了堆管理数据的边界,就会将内存块N覆盖掉。攻击者可以通过溢出直接改写敏感数据如函数指针等内容。上面程序展示了简单的堆溢出漏洞,也简单揭示了堆分配的策略。程序执行前后内存中的模拟图如图2所示。在Linux系统中,该程序的编译执行有如下结果:从上述的编译结果得出,output中的数据已经被覆盖。如果大于003D2480地址空间中含有函数指针,则可以通过给该函数输入足够长的字符串来覆盖该函数地址,从

4、而改变程序的执行流程。(二)堆溢出的攻击防范堆溢出攻击的防范现阶段可分为两种:编译时的静态分析和运行时的动态防范。1.静态分析从本质上讲,缓冲区溢出是由编程语言自身的缺陷引起的,对程序代码进行分析检查的方法称为静态分析。常见的方法就是将C语言中不安全函数进行替换,例如:将strcpy等函数替换为strncpy等函数。除此之外,通过实现类似于编译器前端的工作,使用语法分析的方法,发现程序的缺陷或错误,这是帮助程序员在编译阶段中完成的,如PCLint等。但到目前为止,静态分析工具还处于研究的阶段,功能不完善,不能

5、发现系统中的所有漏洞,并不可避免地存在大量的误报。2.动态防范动态防范主要是采用增强系统内核和监视堆栈等方法。增强系统内核是从环境角度来预防缓冲区溢出。一般情况下,恶意代码会存放在堆或栈上,可以通过禁止执行堆或栈上的代码来提高系统的安全性。比如在linux系统内核上的Pax补丁。但该方法的缺点也是很明显的:由于系统的某些正常代码程序只能放在栈中的,比如linux通过向进程栈填写代码然后引发终端来执行栈中的代码以便实现向进程发送信号。这种使堆栈不可执行的方法具有一定的局限性。监视堆栈的方法是编译器的一个补丁,通

6、常是在堆栈中加一个标记。比如随机放一个"canary”字,在函数返回之前检查“canary"的完整性。二、基于随机方法的堆溢出防范策略[2]内存管理系统是先分配一大块内存,保留这块内存起始部分用于放置管理数据,后面部分作为空闲块分配给用户使用。在管理数据中有一个空闲链表表头数组,数组中每一项元素都是一个双向链表的表头。该双向链表由若干特定大小的空闲块构成,空闲块大小随数组索引递增。此外管理数据中还维护一个大空闲块链表的表头,超过一定大小的空闲块均存放在这个链表中。在LINUX系统中,每个堆实质上是由用户数据区

7、和管理结构区两部分组成。用户数据区存储用户的数据,管理区存放堆的信息,这些信息包括堆是否空闲、堆的大小以及双向链表指针等,图3是已分配好的堆内存映像。MALLOC()函数在内部使用的是CHUNK指针,但给用户返回的是CHUNK+8也就是MEM指针,而指向下一个的是NEXTCHUNK指针。当使用者提出申请时,系统其实掩盖了一个内在的结构,具体说就是,例如,用户需要LONG字节长度的存储单元,但得到的最少是L0NG+8字节长度的,最终用户能使用到的就是LONG字节。以上是对已使用的堆来说的,对于没有被使用的堆来说

8、,它的信息是存储在一个双向循环链表中,图4是它在存储单元中的分布情况。三、随机数的产生方法(一)随机数的应用[3]很明显,要做到随机分配一段内存空间,需要使用随机数。目前应用的随机数通常都是通过某些数学公式计算而产生的伪随机数,即伪随机数发生器产生的,它是由一个初始状态(称为“种子”)开始,通过一个确定的算法来生成随机数。一旦给定算法和种子值,输出序列就是确定的了,有一定的周期性,有规律性和重复性。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。