欢迎来到天天文库
浏览记录
ID:48185195
大小:387.00 KB
页数:23页
时间:2020-01-18
《02 缓冲区溢出原理.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、缓冲区溢出原理教学课件:ftp://218.193.154.238/public/姚砺/代码安全机制与实现技术第四章栈溢出利用缓冲区溢出:就是在大缓冲区中的数据向小缓冲区复制的过程中,由于没有注意小缓冲区的边界,“撑爆”了较小的缓冲区,从而冲掉了和小缓冲区相邻内存区域的其他数据而引起的内存问题。缓冲溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。成功地利用缓冲区溢出漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获得主机的控制权。要透彻地理解这种攻击方式,需要计算机体系架构方面的基础知识,理解CPU、寄存器、内存是怎样
2、协同工作而让程序流畅执行的。系统栈的工作原理内存的不同用途根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分成以下4个部分。(1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。(2)数据区:用于存储全局变量等。(3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。(4)栈区:用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到调用函数中继续执行。在Windows平台下,高级语言写出的
3、程序经过编译链接,最终会变成第2章介绍过的PE文件。当PE文件被装载运行后,就成了所谓的进程。PE文件代码段中包含的二进制级别的机器代码会被装入内存的代码区,处理器将到内存的这个区域一条一条地取出指令和操作数,并送入算术逻辑单元进行运算;如果代码中请求开辟动态内存,则会在内存的堆区分配一块大小合适的区域返回给代码区的代码使用;当函数调用发生时,函数的调用关系等信息会动态地保存在内存的栈区,以供处理器在执行完被调用函数的代码时,返回母函数。这个协作过程如下图所示。进程的内存使用示意图栈与系统栈系统栈系统栈由系统自动维护,它用于实现高级语言中函数的调用。对于类似C语言这样的高级语
4、言,系统栈的PUSH、POP等堆栈平衡细节是透明的。一般说来,只有在使用汇编语言开发程序的时候,才需要和它直接打交道。系统栈在其他文献中可能曾被叫做运行栈、调用栈等。函数调用时发生了什么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){intvar_A;var_A=func_B(arg_A1,arg_A2)+arg_A1;returnva
5、r_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的时候,首先在自己的栈帧中压入函数返回地址,然后为func_A创建新栈帧并压入系统栈;(2)在func_A调用func_B的时候,同样先在自己的栈帧
6、中压入函数返回地址,然后为func_B创建新栈帧并压入系统栈;(3)在func_B返回时,func_B的栈帧被弹出系统栈,func_A栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址重新跳到func_A代码区中执行;(4)在func_A返回时,func_A的栈帧被弹出系统栈,main函数栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址跳到main函数代码区中执行。寄存器与函数栈帧每一个函数独占自己的栈帧空间。当前正在运行的函数的栈帧总是在栈顶。Win32系统提供两个特殊的寄存器用于标识位于系统栈顶端的栈帧。(1)ESP:栈指针寄存器(extendedsta
7、ckpointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。(2)EBP:基址指针寄存器(extendedbasepointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念,也就是,每个函数都有自己独立的EBP和ESP;所以,每个函数运行时都要将EBP和ESP的值切换成自己的值。图4.1.5栈帧寄存器ESP与EBP的作用寄存器与函数栈帧函数栈帧
此文档下载收益归作者所有