windows栈溢出利用

windows栈溢出利用

ID:19676397

大小:143.00 KB

页数:14页

时间:2018-10-04

windows栈溢出利用_第1页
windows栈溢出利用_第2页
windows栈溢出利用_第3页
windows栈溢出利用_第4页
windows栈溢出利用_第5页
资源描述:

《windows栈溢出利用》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、Windows栈溢出分析摘要众所周知,缓冲区溢出是目前最为常见的漏洞利用方式,特别是栈溢出,原理简单,危害大。在Windowsxpsp2以后,微软增加了许多安全检查措施来杜绝缓冲区溢出的发生。本文介绍两种Windowsxp下两种常见的栈溢出利用方式,重点分析利用S.E.H进行栈溢出,并且归纳总结防范和检测方法。第一章绪论1.1栈溢出定义程序的局部变量一般都存放在栈空间内,如果用户输入的数据超过了定义的长度,就会非法覆盖栈空间的其他数据,这种现象就是栈溢出。1.2栈溢出普通利用方式1.2.1利用函数返回点函数调用约定描述了函数传递参数方式和栈协同工作的技术细节。不同的

2、操作系统,不同的语言,不同的编译器在实现函数调用时的原理虽然基本相同,但具体的调用约定还是有差别的,包括参数传递方式,参数入栈顺序是从右向左还是从左向右,函数返回时候恢复堆栈平衡的操作在子函数进行还是在母函数中进行。下表列出了几种调用方式。对于VisualC++,可支持以下三种函数调用约定,如下表默认情况下,VC使用_stdcall的调用方式。本文以下讨论如不另加说明,即指这种默认的调用方式。函数调用大致包括以下几个步骤:(1)参数入栈:将参数从右向左依次压入系统栈中;(2)返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行;(3)代码

3、区跳转:处理器从当前代码区跳转到被调函数的入口地址;(4)栈帧调整,包括保存当前栈帧状态值,已备后面恢复本栈帧时使用。将当前栈帧切换到新栈帧。给新栈帧分配空间。对于_stdcall调用约定,函数调用时用到的汇编指令序列如下:Push参数;从右至左Call函数地址;Pushebp;Movebp,esp;Subesp,xxx;类似地,函数返回的步骤如下:(1)保存返回值:通常将函数的返回值保存在Eax;(2)弹出当前栈帧,恢复上一个栈帧。(3)跳转:按照函数返回地址跳回母函数中继续执行。相关的汇编指令序列如下:Addesp,xxx;Popebp;Retn可以看到函数返回

4、点保存在栈中,且栈中的数据是可以被任意覆盖的,这就为利用提供了可能性。第二章S.E.H利用分析2.1结构化异常处理(SEH)操作系统或程序在运行,难免会遇到各种各样的错误,如除零,非法内存访问,文件打开错误,内存不足,磁盘读写错误,外设操作失败。为了保证系统在遇到错误时不至于崩溃,仍能够健壮稳定地继续运行下去,windows会对运行在其中的程序提供一次补救的机会来处理错误这种机制就是异常处理机制。S.E.H即异常处理结构体(StructureExceptionHandler),它是windows异常处理机制所采用的重要数据结构,每个S.E.H包含两个DWORD指针:

5、S.E.H链表指针和异常处理函数句柄,共8个字节,如下图下面分别对用户模式下的原始型SEH和封装型SEH进行讨论。2.1.1原始型SEHSEH的进程相关类型是整个进程作用范围的异常处理函数,通过WIN32API函数SetUnhandledExceptionFilter进行注册,而操作系统内部使用一个全局变量来记录这个顶层的处理函数,因此只能有一个全局性的异常处理函数。而线程相关类型的作用范围是本线程内,并且可注册多个,甚至可以嵌套注册。两者相比线程相关类型在实际应用中使用较为广泛,因此此处重点对此类型进行研究。当线程初始化时,会自动向栈中安装一个异常处理结构,作为线

6、程默认的异常处理。SEH最基本的数据结构是保存在堆栈中的称为EXCEPTION_REGISTRATION的结构体,结构体包括2个元素:第1个元素是指向下一个EXCEPTION_REGISTRATION结构的指针(prev),第2个元素是指向异常处理程序的指针(handler)。这样一来,基于堆栈的异常处理程序就相互连接成一个链表。异常处理结构在堆栈中的典型分布如图1所示。最顶端的异常处理结构通过线程控制块(TEB)0Byte偏移处指针标识,即FS:[0]处地址。用于进行实际异常处理的函数原型可表示如下:EXCEPTION_DISPOSITION__cdecl_exc

7、ept_handler(struct_EXCEPTION_RECORD*ExceptionRecord,void*EstablisherFrame,struct_CONTEXT*ContextRecord,void*DispatcherContext)该函数的最重要的2个参数是指向_EXCEPTION_RECORD结构的ExceptionRecord参数和指向_CONTEXT结构的ContextRecord参数,前者主要包括异常类别编码、异常发生地址等重要信息;后者主要包括异常发生时的通用寄存器、调试寄存器和指令寄存器的值等重要的线程执行环境。而用于注册异常处理

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。