- 1、本文档共42页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
典型软件漏洞分析
本讲要点1.什么是缓冲区溢出漏洞?2.什么是栈溢出?栈溢出漏洞如何利用?3.什么是堆溢出?堆溢出漏洞如何利用?4.什么是格式化字符串漏洞?该漏洞如何利用?5.针对缓冲区溢出漏洞,Windows平台设置了哪些保护机制?
1.什么是缓冲区溢出漏洞?(1)内存结构Win32系统中,进程使用的内存按功能可以分4个区域堆区栈区代码区数据区高端内存区域(高地址)低端内存区域(低地址)堆增长方向栈增长方向该区域内存由系统自动分配,用于动态存储函数之间的调用关系用于存储全局变量和静态变量存放程序汇编后的机器代码和只读数据该区域内存由进程利用相关函数或运算符动态申请,用完后释放并归还给堆区。例如,C语言中用malloc/free函数,C++语言中用new/delete运算符申请的空间就在堆区。
1.什么是缓冲区溢出漏洞?(2)缓冲区程序中所使用的缓冲区可以是堆区和栈区,也可以是存放静态变量的数据区。由于进程中各个区域都有自己的用途,根据缓冲区利用的方法和缓冲区在内存中所属区域,其可分为栈溢出和堆溢出。
1.什么是缓冲区溢出漏洞?(3)缓冲区溢出漏洞缓冲区溢出漏洞就是在向缓冲区写入数据时,由于没有做边界检查,导致写入缓冲区的数据超过预先分配的边界,从而使溢出数据覆盖在合法数据上而引起系统异常的一种现象。目前,缓冲区溢出漏洞普遍存在于各种操作系统(Windows、Linux、Solaris、FreeBSD、HP-UX以及IBMAIX),以及运行在操作系统上的各类应用程序中。
2.什么是栈溢出?栈溢出漏洞如何利用?(1)函数的栈帧在程序设计中,栈通常指的是一种后进先出的数据结构。相对于广义的栈而言,栈帧是操作系统为进程中的每个函数调用划分的一个空间,每个栈帧都是一个独立的栈结构,而系统栈则是这些函数调用栈帧的集合。系统栈由系统自动维护,用于实现高级语言中函数的调用。
2.什么是栈溢出?栈溢出漏洞如何利用?(1)函数的栈帧当函数被调用时,系统会为这个函数开辟一个新的栈帧,并把它压入栈区中,所以正在运行的函数总是在系统栈区的栈顶(本书称为:当前栈帧)。当函数返回时,系统会弹出该函数所对应的栈帧空间。栈帧的生长方向是从高地址向低地址增长的。main函数栈帧intfunc_B(){......}intfunc_A(){func_B();}intmain(){func_A();}EBPfunc_A函数栈帧func_B函数栈帧未使用的栈区ESP?栈增长方向高地址低地址
2.什么是栈溢出?栈溢出漏洞如何利用?(1)函数的栈帧ESP:扩展栈指针(ExtendedStackPointer)寄存器,其存放的指针指向当前栈帧的栈顶。EBP:扩展基址指针(ExtendedBasePointer)寄存器,其存放的指针指向当前栈帧的栈底。显然,ESP与EBP之间的空间即为当前栈帧空间。main函数栈帧intfunc_B(){......}intfunc_A(){func_B();}intmain(){func_A();}EBPfunc_A函数栈帧func_B函数栈帧未使用的栈区ESP?栈增长方向高地址低地址
2.什么是栈溢出?栈溢出漏洞如何利用?(1)函数的栈帧一个函数栈帧中主要包含如下信息。1)前一个栈帧的栈底位置,即前栈帧EBP,用于在函数调用结束后恢复主调函数的栈帧(前栈帧的栈顶可计算得到)。2)该函数的局部变量。3)函数调用的参数。4)函数的返回地址RET,用于保存函数调用前指令的位置,以便函数返回时能恢复到调用前的代码区中继续执行指令。
2.什么是栈溢出?栈溢出漏洞如何利用?(2)函数调用的步骤1)参数入栈。将被调用函数的实际参数从右到左依次压入主调函数的函数栈帧中。2)返回地址RET入栈。将当前指令的下一条指令地址压入主调函数的函数栈帧中。3)代码区跳转。CPU从当前代码区跳转到被调用函数的入口,EIP指向被调用函数的入口处。4)将当前栈帧调整为被调用函数的栈帧
2.什么是栈溢出?栈溢出漏洞如何利用?(2)函数调用的步骤①将主调函数的栈帧底部指针EBP入栈,以便被调用函数返回时恢复主调函数的栈帧。②更新当前栈帧底部:将主调函数的栈帧顶部指针ESP的值赋给EBP,作为新的当前栈帧(即被调用函数的栈帧)底部。③为新栈帧分配空间:ESP减去适当的值,作为新的当前栈帧的栈顶。4)将当前栈帧调整为被调用函数的栈帧
2.什么是栈溢出?栈溢出漏洞如何利用?(2)函数调用的步骤①保存返回值。将函数的返回值保存在寄存器EAX中。②弹出当前栈帧,将前一个栈帧(即主调函数栈帧)恢复为当前栈帧返回主调函数的步骤
2.什么是栈溢出?栈溢出漏洞如何利用?(2)函
文档评论(0)