全球旧事资料 分类
缓冲区溢出漏洞
IBM软件研究院
缓冲区溢出漏洞,是一种在软件中最容易发生的漏洞。它发生的原理是,由于软件在处理用户数据时使用了不限边界的拷贝,导致程序内部一些关键的数据被覆盖,引发了严重的安全问题。缓冲区指的是操作系统中用来保存临时数据的空间,一般分为栈和堆两种缓冲区类型。缓冲区溢出漏洞是一种非常普通、非常危险的漏洞,在各种操作系统、应用软件,甚至是Web应用程序中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。在当前网络与操作系统安全中,50以上的攻击都是来自于缓冲区溢出漏洞。而缓冲区溢出中,最为危险的是栈溢出,因为入侵者可以利用栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,然后为所欲为。这里要澄清一个概念,很多人把缓冲区溢出称之为堆栈溢出漏洞,其实是错误的,堆溢出和栈溢出是两个不同的概念,都属于缓冲区溢出。平时听说的缓冲区溢出大部分都是属于栈溢出。由于程序在实现的过程中,往往会自定义一些内存空间来负责接受或者存储数据,这些被直接定义的空间大小是有限的,因此当程序将过多的数据不经检查而直接放入这些空间中时,就会发生栈溢出。栈溢出最为直接的危害是,这些被过量放进内存空间的数据会将函数的返回地址覆盖。“返回地址”的概念来自于CPU处理指令的结构设计。如果程序现在准备调用一个函数,CPU首先会将执行完这个函数后将要执行的指令地址存储到栈空间中,然后CPU开始执行函数,执行完毕,CPUCPU取出前面保存的指令地址,然后接着执行。这个“返回地址”是保存在栈空间中的,而程序一般定义的空间也是在栈中进行分配的,这就给了我们覆盖这个“返回地址”的机会。栈是一个先进后出的空间,而堆则恰恰相反,是一个先进先出的空间。缓冲区溢出就是把这些空间装满后还继续往里面装。但是对于一个软件来讲,危害可能不仅仅如此,用一个表来表示这个过程在栈溢出发生的时候,软件运行时内存中的情况。正常:LowerAddressesbuf2buf1var3savedEBPretur
addressfu
ctio
sargume
tssavedEBP
fretur
addresssmai
sargume
tsHigherAddresses溢出:LowerAddressesbuf2buf1414141414141414141414141(当栈溢出发生时,esp寄存器指向这里)41414141retur
address41414141savedEBPretur
addressr
好听全球资料 返回顶部