- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
防止缓冲区溢出杜绝如今最常见的程序缺陷方案
防止缓冲区溢出杜绝如今最常见的程序缺陷方案 什么是缓冲区溢出? 缓冲区以前可能被定义为“包含相同数据类型的实例的一个连续计算机内存块”。在 C 和 C++ 中,缓冲区通常是使用数组和诸如 malloc() 和 new 这样的内存分配例程来实现的。极其常见的缓冲区种类是简单的字符数组。溢出 是指数据被添加到分配给该缓冲区的内存块之外。 如果攻击者能够导致缓冲区溢出,那么它就能控制程序中的其他值。虽然存在许多利用缓冲区溢出的方法,不过最常见的方法还是“stack-smashing”攻击。Elias Levy (又名为 Aleph One)的一篇经典文章“Smashing the Stack for Fun and Profit”解释了 stack-smashing 攻击,Elias Levy 是 Bugtraq 邮件列表(请参阅 参考资料 以获得相关链接)的前任主持人。 为了理解 stack-smashing 攻击(或其他任何缓冲区攻击)是如何进行的,您需要了解一些关于计算机在机器语言级实际如何工作的知识。在类 UNIX 系统上,每个进程都可以划分为三个主要区域:文本、数据和堆栈。文本区域 包括代码和只读数据,通常不能对它执行写入操作。数据区域 同时包括静态分配的内存(比如全局和静态数据)和动态分配的内存(通常称为 堆)。堆栈区域 用于允许函数/方法调用;它用于记录函数完成之后的返回位置,存储函数中使用的本地变量,向函数传递参数,以及从函数返回值。每当调用一个函数,就会使用一个新的 堆栈帧 来支持该调用。了解这些之后,让我们来考察一个简单的程序。 清单 1. 一个简单的程序 void function1(int a, int b, int c) { char buffer1[5]; gets(buffer1); /* DONT DO THIS */ } void main() { function(1,2,3); } 假设使用 gcc 来编译清单 1 中的简单程序,在 X86 上的 Linux 中运行,并且紧跟在对 gets()的调用之后中止。此时的内存内容看起来像什么样子呢?答案是它看起来类似图 1,其中展示了从左边的低位地址到右边的高位地址排序的内存布局。 内存的底部 内存的顶部 buffer1 sfp ret a b c --- 增长 --- [ ] [ ] [ ] [ ] [ ] [ ] ... 堆栈的顶部 堆栈的底部 许多计算机处理器,包括所有 x86 处理器,都支持从高位地址向低位地址“倒”增长堆栈。因此,每当一个函数调用另一个函数,更多的数据将被添加到左边(低位地址),直至系统的堆栈空间耗尽。在这个例子中,当 main() 调用 function1()时,它将 c 的值压入堆栈,然后压入 b 的值,最后压入 a 的值。之后它压入 return (ret)值,这个值在 function1()完成时告诉 function1() 返回到 main() 中的何处。它还把所谓的“已保存的帧指针(saved frame pointer,sfp)”记录到堆栈上;这并不是必须保存的内容,此处我们不需要理解它。在任何情况下,function1()在启动以后,它会为 buffer1()预留空间,这在图 1 中显示为具有一个低地址位置。 现在假设攻击者发送了超过 buffer1() 所能处理的数据。接下来会发生什么情况呢?当然,C 和 C++ 程序员不会自动检查这个问题,因此除非程序员明确地阻止它,否则下一个值将进入内存中的“下一个”位置。那意味着攻击者能够改写 sfp(即已保存的帧指针),然后改写 ret(返回地址)。之后,当 function1() 完成时,它将“返回”—— 不过不是返回到 main(),而是返回到攻击者想要运行的任何代码。 通常攻击者会使用它想要运行的恶意代码来使缓冲区溢出,然后攻击者会更改返回值以指向它们已发送的恶意代码。这意味着攻击者本质上能够在一个操作中完成整个攻击!Aleph On 的文章(请参阅 参考资料)详细介绍了这样的攻击代码是如何创建的。例如,将一个 ASCII 0 字符压入缓冲区通常是很困难的,而该文介绍了攻击者一般如何能够解决这个问题。 除了 smashing-stack 和更改返回地址外,还存在利用缓冲区溢出缺陷的其他途径。与改写返回地址不同,攻击者可以 smashing-stack(使堆栈上的缓冲区溢出),然后改写局部变量以利用缓冲区溢出缺陷。缓冲区根本就不必在堆栈上 —— 它可以是堆中动态分配的内存(也
文档评论(0)