缓冲区溢出..docVIP

  1. 1、本文档共16页,可阅读全部内容。
  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文档。上传文档
查看更多
缓冲区溢出.

一、专题目标/任务概述 掌握缓冲区溢出的原理、缓冲区溢出漏洞的利用技巧,理解缓冲区溢出漏洞的防范措施;通过对一个包含缓冲区溢出的实例程序的分析来了解缓冲区溢出漏洞产生的基本原理和攻击方法。 二、实践环境与工具/平台 vc6.0 三、专题所涉及的基本原理 1、概念: 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上 图1:Windows下程序在内存中的结构 (2)函数调用过程 堆栈(简称栈)是一种先进后出的数据表结构。栈有两种常用操作:压栈和出栈。栈有两个重要属性:栈顶和栈底。内存的栈区实际上指的是系统栈。系统栈由系统自动维护,用于实现高级语言的函数调用。 每个函数在被调用时都有属于自己的栈帧空间。当函数被调用时,系统会为这个函数开辟一个新的栈帧,并把它压入栈中,所以正在运行的函数总是在系统栈的栈顶。当函数返回时,系统栈会弹出该函数所对应的栈帧空间。 win32系统提供了两个特殊的寄存器来标识系统栈最顶端的栈帧。 ESP:扩展堆栈指针。该寄存器存放一个指针,它指向系统栈最顶端那个函数栈帧的栈顶。 EBP:扩展基指针。该寄存器存放一个指针,它指向系统栈最顶端那个函数栈帧的栈底。 另外,EIP寄存器(扩展指令指针)对于堆栈的操作非常重要,EIP包含将要被执行的吓一跳指令的地址。 函数栈帧:ESP和EBP之间的空间为当前栈帧,每一个函数都有属于自己的ESP和EBP指针。ESP表示了当前栈帧的栈顶,EBP标识了当前栈的栈底。 在一个函数栈帧中,一般包括以下重要的信息: ①局部变量:系统会在该函数栈帧上为该函数运行时的局部变量分配相应的内存空间。 ②函数返回地址:存放了本函数执行完后应该返回到调用本函数的主函数中继续执行的指令的位置。 在win32操作系统中,当程序里出现函数调用时,系统会自动为这次函数调用分配一个堆栈。函数的调用大概包括下面几个步骤: ①参数入栈:一般是将被调函数的参数从右到左一次压入系统栈(即调用该函数的主函数的函数栈帧)中。 ②返回地址入栈:把当前EIP的值(当前代码区正在执行指令的下一条指令的地址)压入栈中,作为返回地址。 ③代码区跳转:将EIP指向被调用函数的入口处。 ④栈帧调整:主要是用来保持堆栈平衡,这个过程可以由被调用函数执行,也可以由主函数制造型,具体由编译器决定。首先是将EBP压入栈中(用于调用返回时回复原堆栈),并把主函数的ESP的值送入寄存器EBP中,作为新的基址(新栈帧的EBP实际上保存的是主函数的ESP),最后,为本地变量留出空间,把ESP减去适当的值(内存分配时以字为单位的)。 函数调用结束后的返回过程如下: ①保存返回值:通常将函数的返回值保存在寄存器 EAX 中。 ②弹出当前栈帧,恢复上一个栈帧。 a) 在堆栈平衡的基础上,给 ESP 加上栈帧的大小,降低栈顶,回收当 前栈帧空间。 b) 将当前栈帧底部的 EBP 的值( 母函数的栈底地址)弹入 EBP 寄存器, 使得 EBP 指向母函数的栈底。 c) 将函数返回地址弹入 EIP 寄存器。 ③跳转到新的 EIP 处执行指令(已经返回到了主函数) 。 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。strcat(),sprintf(),vsprintf(),gets(),scanf()随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序有root或者suid执行权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标: 1在程序的地址空间里安排适当的代码。 2通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。 可以根据这两个目标来对缓冲区溢出攻击进行分类。 图2:程序正常运行结果 ②缓冲区溢出运行情况如图3. 图3:缓冲区溢出导致程序异常退出 ③利用溢出实现攻击如图4. 图4:利用溢出实现攻击 (2)课后练习例子及分析 ①正常情况如图5. 图5:程序正常运行结果 ②缓冲区溢出运行情况如图6. 图6:缓

文档评论(0)

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

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

1亿VIP精品文档

相关文档