缓冲区溢出要点.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络攻击 缓冲区溢出 Windows系统中缓冲区溢出 2001年“红色代码”蠕虫 利用微软IIS Web Server中的缓冲区溢出漏洞使300 000多台计算机受到攻击 2003年1月,Slammer蠕虫爆发, 利用的是微软SQL Server 2000中的缺陷 2004年5月爆发的“振荡波” 利用了Windows系统的活动目录服务缓冲区溢出漏洞; 2005年8月“狙击波” 利用Windows即插即用缓冲区溢出漏洞,被称为历史上最快利用微软漏洞进行攻击的恶意代码 2008年底至2009年的Conficker蠕虫 利用的是Windows处理远程RPC请求时的漏洞(MS08-067) 缓冲区溢出相关概念 缓冲区 从程序的角度,缓冲区就是应用程序用来保存用户输入数据、程序临时数据的内存空间 缓冲区的本质 数组 存储位置 Stack Heap 数据段 缓冲区溢出相关概念 如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,形成所谓的缓冲区溢出 简单溢出实例 #include stdio.h int main() { char name[8] = {0}; printf(“Your name:”); gets(name); printf(“Hello,%s!”,name); return 0; } 缓冲区溢出的危害 利用缓冲区溢出漏洞进行的攻击已经占所有系统攻击总数的80%以上 应用程序异常 系统不稳定甚至崩溃 程序跳转到恶意代码,控制权被窃 程序在内存中的映像 栈 栈是一块连续的内存空间 先入后出 生长方向与内存的生长方向正好相反, 从高地址向低地址生长 每一个线程有自己的栈 提供一个暂时存放数据的区域 使用POP/PUSH指令来对栈进行操作 使用ESP寄存器指向栈顶,EBP指向栈帧底 栈内容 函数的参数 函数返回地址 EBP的值 一些通用寄存器(EDI,ESI…)的值 当前正在执行的函数的局部变量 三个重要的寄存器 SP(ESP) 即栈顶指针,随着数据入栈出栈而发生变化 BP(EBP) 即基地址指针,用于标识栈中一个相对稳定的位置。通过BP,可以方便地引用函数参数以及局部变量 IP(EIP) 即指令寄存器,在将某个函数的栈帧压入栈中时,其中就包含当前的IP值,即函数调用返回后下一个执行语句的地址 函数调用过程 把参数压入栈 保存指令寄存器中的内容,作为返回地址 放入堆栈当前的基址寄存器 把当前的栈指针(ESP)拷贝到基址寄存器,作为新的基地址 为本地变量留出一定空间,把ESP减去适当的数值 函数调用中栈的工作过程 调用函数前 压入栈 上级函数传给A函数的参数 返回地址(EIP) 当前的EBP 函数的局部变量 调用函数后 恢复EBP 恢复EIP 局部变量不作处理 例子 int AFunc(int i,int j) { int m = 3; int n = 4; ????m = i; n = j; ????BFunc(m,n); ????return 8; } int BFunc(int i,int j) { int m = 1; int n = 2; m = i; n = j; return m; } 函数调用中栈的工作过程 函数调用中栈的工作过程 缓冲区溢出发生…… int AFunc(int i,int j) { int m = 3; int n = 4; char szBuf[8] = {0}; strcpy(szBuf, “This is a overflow buffer!”); ????m = i; n = j; ????BFunc(m,n); ????return 8; } 缓冲区溢出原理及其利用 缓冲区溢出种类 栈溢出 堆溢出 整型溢出 格式化字符串溢出 其他溢出 栈溢出 特点 缓冲区在栈中分配 拷贝的数据过长 覆盖了函数的返回地址或其它一些重要数据结构、函数指针 栈溢出实例 int AFunc(int i,int j) { int m = 3; int n = 4; char szBuf[8] = {0}; *(int *)((int)szBuf+20) = BFunc; ????m = i; n = j; ????BFunc(m,n); ????return 8; } 堆溢出 堆和栈有何区别 内存的动态分配与静态分配 堆溢出特点 缓冲区在堆中分配 拷贝的数据过长 覆盖了堆管理结构 #define BUFLEN 32 int main(int argc, char* argv[ ]) { char *buf1; buf1 = (char*)m

文档评论(0)

武神赵子龙 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档