02 缓冲区溢出原理.ppt
《02 缓冲区溢出原理.ppt》由会员分享,可在线阅读,更多相关《02 缓冲区溢出原理.ppt(23页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、代码安全机制与实现技术 缓冲区溢出原理缓冲区溢出原理教学课件教学课件:ftp:/218.193.154.238/public/姚砺/代码安全机制与实现技术代码安全机制与实现技术课程概述课程概述第四章栈溢出利用n缓冲区溢出:就是在大缓冲区中的数据向小缓冲区复制的过程中,由于没有注意小缓冲区的边界,“撑爆”了较小的缓冲区,从而冲掉了和小缓冲区相邻内存区域的其他数据而引起的内存问题。缓冲溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。n成功地利用缓冲区溢出漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获得主机的控制权。要透彻地理解这种攻击方
2、式,需要计算机体系架构方面的基础知识,理解CPU、寄存器、内存是怎样协同工作而让程序流畅执行的。课程概述课程概述系统栈的工作原理n内存的不同用途根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分成以下4 个部分。(1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。(2)数据区:用于存储全局变量等。(3)堆 区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。(4)栈 区:用于动态地存储函数之间的调用关系,以保证被调用函数在返回
3、时恢复到调用函数中继续执行。在Windows平台下,高级语言写出的程序经过编译链接,最终会变成第2章介绍过的PE文件。当PE文件被装载运行后,就成了所谓的进程。PE文件代码段中包含的二进制级别的机器代码会被装入内存的代码区,处理器将到内存的这个区域一条一条地取出指令和操作数,并送入算术逻辑单元进行运算;如果代码中请求开辟动态内存,则会在内存的堆区分配一块大小合适的区域返回给代码区的代码使用;当函数调用发生时,函数的调用关系等信息会动态地保存在内存的栈区,以供处理器在执行完被调用函数的代码时,返回母函数。这个协作过程如下图所示。课程概述课程概述进程的内存使用示意图课程概述课程概述课程概述课程概述
4、栈与系统栈n系统栈系统栈由系统自动维护,它用于实现高级语言中函数的调用。对于类似C语言这样的高级语言,系统栈的PUSH、POP等堆栈平衡细节是透明的。一般说来,只有在使用汇编语言开发程序的时候,才需要和它直接打交道。n系统栈在其他文献中可能曾被叫做运行栈、调用栈等。课程概述课程概述函数调用时发生了什么函数调用时发生了什么intfunc_B(intarg_B1,intarg_B2)intvar_B1,var_B2;var_B1=arg_B1+arg_B2;var_B2=arg_B1-arg_B2;returnvar_B1*var_B2;intfunc_A(intarg_A1,intarg_A2)
5、intvar_A;var_A=func_B(arg_A1,arg_A2)+arg_A1;returnvar_A;intmain(intargc,char*argv)intvar_main;var_main=func_A(4,3);returnvar_main这段代码编译后,各个函数对应的机器指令在代码区中可能是这样分布的(我们可以简单地把它们在内存代码区中的分布位置理解成是散乱无关的)。课程概述课程概述图4.1.4系统栈在函数调用时的变化如图4.1.4所示,在函数调用的过程中,伴随的系统栈中的操作如下:(1)在main函数调用func_A的时候,首先在自己的栈帧中压入函数返回地址,然后为fun
6、c_A创建新栈帧并压入系统栈;(2)在func_A调用func_B的时候,同样先在自己的栈帧中压入函数返回地址,然后为func_B创建新栈帧并压入系统栈;(3)在func_B返回时,func_B的栈帧被弹出系统栈,func_A栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址重新跳到func_A代码区中执行;(4)在func_A返回时,func_A的栈帧被弹出系统栈,main函数栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址跳到main函数代码区中执行。课程概述课程概述寄存器与函数栈帧n每一个函数独占自己的栈帧空间。当前正在运行的函数的栈帧总是在栈顶。Win32系统提供两个
7、特殊的寄存器用于标识位于系统栈顶端的栈帧。n(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。n(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。n注意:注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念,也就是,每个函数都有自己独立的EBP和ESP;所以,每个函数运行时都要将EBP和ESP的值切换成自己的值。课程概述课程概述图4.1.5栈帧寄存器ESP与
8、EBP的作用寄存器与函数栈帧n函数栈帧:ESP和EBP之间的内存空间为当前栈帧,EBP标识了当前栈帧的底部,ESP标识了当前栈帧的顶部。在函数栈帧中,一般包含以下几类重要信息。(1)局部变量:为函数局部变量开辟的内存空间。(2)栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过堆栈平衡计算得到),用于在本帧被弹出后恢复出上一个栈帧。(3)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回时能够恢复到函数被调用前的代码区中继续执行指令。课程概述课程概述函数调用过程n函数调用大致包括以下几个步骤。(1)参数入栈:将参数从右向左
9、依次压入系统栈中。(2)返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行。(3)代码区跳转:处理器从当前代码区跳转到被调用函数的入口处。(4)栈帧调整:具体包括。n保存当前栈帧状态值,已备后面恢复本栈帧时使用(EBP入栈)。n将当前栈帧切换到新栈帧(将ESP值装入EBP,更新栈帧底部)。n给新栈帧分配空间(把ESP减去所需空间的大小,抬高栈顶)。课程概述课程概述/假设该函数有3个参数,将从右向左依次入栈push参数3push参数2push参数1call函数地址;call指令将同时完成两项工作:a)向栈中压入当前指令在内存;中的位置,即保存返回地址。b)跳转到所调
10、用函数的入口地址函;数入口处pushebp;保存旧栈帧的底部movebp,esp;设置新栈帧的底部(栈帧切换)subesp,xxx;设置新栈帧的顶部(抬高栈顶,为新栈帧开辟空间)图4.1.7函数调用时系统栈的变化过程课程概述课程概述函数调用过程n函数返回的步骤:(1)保存返回值:通常将函数的返回值保存在寄存器EAX中。(2)弹出当前栈帧,恢复上一个栈帧。n具体包括:a)在堆栈平衡的基础上,给ESP加上栈帧的大小,降低栈顶,回收当前栈帧的空间;b)将当前栈帧底部保存的前栈帧EBP值弹入EBP寄存器,恢复出上一个栈帧;c)将函数返回地址弹给EIP寄存器。(3)跳转:按照函数返回地址跳回调用函数中继
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 02 缓冲区溢出原理 缓冲区 溢出 原理
限制150内