内存安全.pptVIP

  1. 1、本文档共70页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内存安全

第2章 内存安全 2.1 缓冲区溢出 2.1.1 缓冲区 在程序设计的过程中,很多场合下都用到了缓冲区的概念。缓冲区,保存于内存中,简单说来是一块连续的计算机内存区域,可以保存相同数据类型的多个实例。举例说明,如下代码: 这是一个C语言编写的函数,函数strcpy()具有一个输入参数:input,该函数的功能是将input中的内容copy到buffer中。在该代码中,buffer数组可以保存多个字符(数据类型相同),可以称为是缓冲区。 为了方便起见,缓冲区溢出的问题,通常利用C语言来进行讲解。实际上,在C中,由于字符数组中字符个数的不确定,最常见的产生缓冲区问题的场合就是对字符数组的操作。 字符数组,与C语言中所有的变量一样,可以被声明为静态或动态,静态变量在程序加载时定位于数据段,动态变量在程序运行时定位于堆栈之中。 本章讲解的缓冲区溢出问题,主要是针对动态缓冲区的溢出问题,即基于堆栈的缓冲区溢出,里面牵涉到的字符数组也是动态的。 堆栈缓冲区是进程在内存中运行时的分配的一部分区域。实际上,进程在内存中运行时,被分成三个区域: 程序代码区; 静态存储区; 动态存储区(堆栈)。 其中,程序代码区是由程序确定的,主要包括了只读数据和代码(指令)。在可执行文件中,该区域相当于文本段。一般情况下,程序确定了,这部分内容也就确定。程序代码区中的内容通常是只读的,无法对其内容进行修改,任何对其写入的操作都会导致段错误。 其次,静态存储区包含了已初始化和未初始化的数据,但里面的数据都是静态的,如静态变量就储存在这个区域中。实际上,该区域内存放的数据是在编译时分配存储单元,程序结束时才回收。 动态存储区(堆栈区)中的变量是在程序运行期间,根据程序需要,随时动态分配的存储空间。如局部变量所占据的空间就属于该区域内,该区域最容易发生缓冲区溢出,是本章研究的重点。 提示: 堆栈是一个常见的抽象数据类型。堆栈中的数据具有一个特性:最后一个放入堆栈中的数据,总是被最先拿出来(后进先出,LIFO)。在堆栈中通常有一个指针指向栈顶,堆栈中的两个最重要的运算是: PUSH:在堆栈的顶部加入一个元素,栈顶上移; POP:在堆栈顶部移去一个元素,并将堆栈的大小减一,栈顶下移。 堆栈的结构和相关操作在《算法和数据结构》中具有比较详细的讲解,有兴趣的读者可以参考相关文献。 堆栈和程序设计具有非常紧密的关系。举一个例子来说,在使用高级语言构造程序时,不可避免地遇到过程(procedure)或函数(function)的调用。一个函数调用另一个函数时,可以跳转去运行另一个函数,从某种程度上讲,相当于改变了程序的控制流程;但这又不是完全的跳转,因为当工作完成时必须返回,函数把控制权返回给调用之后的语句或指令,所以跳转前必须保存现场。 当函数调用嵌套较多时,数据现场的保存就相当复杂,因为A函数调用B函数,需要保存A函数的现场,B函数中又调用C函数,此时又要保存B函数的现场,调用完毕,先恢复B的现场,再恢复A的现场,并且A、B、C中还有可能具有相同名字的局部变量。如果不采用科学的方法,数据就会乱套。嵌套函数调用这种高级抽象实现起来通常可以靠堆栈的帮助,堆栈也用于给函数中使用的局部变量动态分配空间,给函数传递参数和函数返回值时也要用到堆栈。 从程序设计的底层来讲,堆栈是内存中一块保存数据的连续空间,它的使用主要有如下特点: 一个名为堆栈指针(SP)的寄存器指向堆栈的顶部; 堆栈的底部地址固定; 堆栈的大小在运行时由内核动态地调整; CPU实现指令PUSH和POP来向堆栈中添加元素和从中移去元素。 当调用函数时,要保存的现场数据被压入堆栈中;当函数返回时,数据从堆栈中弹出。当然,堆栈中的数据可能比较复杂,如包括函数的参数、函数局部变量等。观察如下例子: 该程序中定义了一个函数function,有两个输入参数;一个主函数main,调用function。将该文件放入Turboc环境中(如C:\Turboc2),运行如下命令,将源代码编译并生成汇编代码输出: 在C:\Turboc2下生成了一个P02_01.ASM文件,用文本编辑器打开,可见如下代码片段: 从中可以发现,main函数里面调用function函数的时候,两个实际参数2和1被压入堆栈中,然后才用指令call调用function函数。将2和1压入堆栈,就相当于保存了现场。 2.1.2 缓冲区溢出 缓冲区溢出是一种非常普遍、非常危险的漏洞。它有多种英文名称,如buffer overflow、buffer overrun、smash the stack、trash the stack等等,它也是一种比较有历史的漏洞,多个著名的漏洞报告都和缓冲区溢出有关,在各种操作系统、应用软件中广泛存在。缓冲区溢出,可以

文档评论(0)

docman126 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7042123103000003

1亿VIP精品文档

相关文档