缓冲区溢出讲义.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
缓冲区溢出讲义 缓冲区 缓冲区的实质就是一块内存空间, dir命令演示:当输入一个不存在的路径时提示”不存在该路径”,但是如果输 入的字符数大于200个发生溢出。 函数调用过程:栈的工作过程 *调用函数前 *把函数参数压栈 *把指令寄存器(EIP)的内容压栈 *将基址寄存器(EBP)压栈 *把当前的栈指针(ESP)赋给基址寄存器(EBP),作为新的基地址 *为本地变量留出一定空间,把ESP减去适当的数值(栈帧大小) 高地址 调用者 栈帧调用者的数据IFrame Pointer (%ebp) —? 调用者 栈帧 调用者的数据 IFrame Pointer (%ebp) —? 函数参数 返回地址 上一个%ebp 恢复 >刖一 栈帧 Stack Pointer(%esp) 被调用函数 保存的寄存器局部变量 Stack Pointer (%esp) 被调用函数 保存的寄存器 局部变量1 栈的 生长 U方向 局部变量n 低地址 缓冲区溢出实例 #includestdio.h #includestring.h char name[]=nabcdefgh; int main() { int i; char output[8]; strcpy(output,name); for (i=0;i8 output[i];i++) printf(\\0x%x,output[i]); return 0; } 将 char name[]=abcdefgh;中的 abcdefgh 替换为 abcdefghijklmnopqrstuvwxyz 则 溢出 修改程序后 name 中的字符变为 “abcdefghijklmnopqrstuvwxyz “,超出了 output 变量中所能容纳的内存空间,原EBP和EIP被” ijklmnop “覆盖,当被“ mnop 覆盖后程序指针指向了新的地址“0x706f6ed”即“mnop”对应的十六进制值, 该值指向的内存地址不存在程序数据,故出现错误提示。 缓冲区溢出攻击基本原理“ (1) 缓冲区溢出问题属于低级语言(C、C++或汇编)中存在的问题,因为 这些语言不是“受控”语言,没有严格的边界检查机制。缓冲区溢出的实质 是由于字符串处理函数(如C语言中的gets、strcpy等)没有对数组的越界 进行监视和处理造成越界的数据覆盖掉其它内存区域造成的。 (2) 缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢 出漏洞普遍并且易于实现,而且缓冲区溢出成为远程攻击的主要手段其原因 在于缓冲区溢出漏洞给予了攻击者所想要的一切,植入并且执行攻击代码。 被植入的攻击代码以一定的权限运行存在缓冲区溢出漏洞的程序,从而得到 被攻击主机的控制权。 (3) 远程溢出威胁最大。 缓冲区溢出种类 1.栈溢出(重点讲解) *特点 缓冲区在栈中分配,拷贝的数据过长,覆盖了函数的返回地址、函数指 针或其它一些重要的数据结构。 *当调用函数时 Call指令会将返回地址(Call指令下一条指令地址)压入栈,Ret指令会 把压栈的返回地址弹给EIP *栈溢出攻击的原理 (1) 缓冲区溢出修改栈中的返回地址(ret) (2) 当函数调用返回,EIP获得被修改后的 断,并执行Shellcode *关键点: 将修改后的ret填到正确的位置 返回地址能正确地指向Shellcode 堆溢出 *特点 缓冲区在堆中分配,拷贝的数据过长,覆盖了堆管理结构。 *与栈溢出的情况不同,在堆溢出中,攻击者无法控制程序,至少不能直接 控制下一步跳转的位置。 *堆溢出可以理解为将超长的数据复制到动态分配的内存块,超越边界,从 而导致覆盖掉内存块间的管理结构或内存块内容。 整型溢出 宽度溢出(Widthness Overflow) 变量中存储的数值超过了改变量类型所能表示的范围 运算溢出(Arithmetic Overflow) 如果存储值是一个运算操作,稍后使用这个结果的程序的任何一部分都将 错误的运行,因为这个计算结果是不正确的。 符号溢出(Signedness Bug) 一个无符号的变量被看作有符号,或者一个有符号的变量被看作无符号 格式化字符串溢出 *关键字 “%n” *产生原因 printf()是不定参数输入,并且不检查输入参数的个数 (5)其它溢出 .data section溢出、PEB/TEB溢出、文件流溢出 缓冲区溢出包括以下三种后果 程序没有影响,继续运行; 》程序运行失败; 被黑客利用,使程序转入运行黑客构造的特殊代码。 缓冲区溢出攻击基本原理 堆、栈 堆栈指的是栈, *栈先进后出,空间有限,因此存储少量数据 *堆长时间存储数据 MSF的主要模块 exploits:是针对不同已知漏洞的利用程序。 payloads:即shellcode,是在

文档评论(0)

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

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

1亿VIP精品文档

相关文档