缓存溢出基础知识

来源:互联网 发布:java基础入门教程视频 编辑:程序博客网 时间:2024/05/16 23:33

 缓存溢出基础知识

 

最近,一种被称为“缓存溢出(buffer overflow)”的设计缺陷,正在严重危害着系统的安全,成为比y2k更为头痛的问题。一旦这个缺陷被别有用心的人发现,就会被利用作为非法入侵的一种手段,破坏电脑中的资料。据统计,通过缓存溢出进行的攻击占所有系统攻击总数的80%以上,最近各大网站所遭受的所谓分布式服务拒绝(ddos)式的攻击也是一种利用缓存溢出原理的攻击方式。 

  简单地说,缓存溢出是指一种攻击系统的手段,通过往程序的缓冲区中写入超出其长度的内容造成溢出,从而破坏程序的堆栈,使程序转而执行其它指令,而达到攻击的目的。分布式拒绝服务(ddos)的入侵者采用的是输入很长的字串,将通讯栏等区域填到超过设计的容量,有些多余字串就会被电脑误认为是执行密码,使入侵者有机会进入电脑,而同时系统无法察觉。有报告指出,“缓存溢出”是过去十年发生的非常普遍的电脑安全问题,入侵者可以利用它完全控制电脑。 

  缓存溢出黑客们的惯用伎俩 

  在unix系统中,通过缓存溢出来获得root权限是目前使用得相当普遍的一种黑客技术。事实上这是一个黑客在系统本地已经拥有了一个基本账号后的首选攻击方式。它也被广泛应用于远程攻击,通过对daemon进程的堆栈溢出来实现远程获得rootshell的技术,已经有很多实例。 

  在windows系统中,同样存在着缓存溢出的问题。而且,随着internet的普及,win系列平台上的internet服务程序越来越多,低水平的win程序就成为你系统上的致命伤,因为它们同样会发生远程堆栈溢出。而遥捎赵in系统使用者和管理者普遍缺乏安全防范意识,一台win系统上的堆栈溢出,如果被恶意利用,将导致整个机器被黑客所控制,进而可能导致整个局域网落入黑客之手。在微软的产品iis server4.0中就被发现存在一种被称为“非法htr请求”的缺陷。据微软称,此缺陷在特定情况下会导致任意代码都可以在服务器端运行。黑客可以利用这一漏洞对iis服务器进行完全的控制,而实际上许多电子商务站点恰恰是基于这套系统的。 

  黑客如何搅乱缓存 

  下面让我们了解一下缓存溢出的原理。众说周知,c语言不进行数组的边界检查,在许多运用c语言实现的应用程序中,都假定缓冲区的大小是足够的,其容量肯定大于要拷贝的字符串的长度。然而事实并不总是这样,当程序出错或者恶意的用户故意送入一过长的字符串时,便有许多意想不到的事情发生,超过的那部分字符将会覆盖与数组相邻的其他变量的空间,使变量出现不可预料的值。如果碰巧,数组与子程序的返回地址邻近时,便有可能由于超出的一部分字符串覆盖了子程序的返回地址,而使得子程序执行完毕返回时转向了另一个无法预料的地址,使程序的执行流程发生了错误。甚至,由于应用程序访问了不在进程地址空间范围的地址,而使进程发生违例的故障。这种错误其实是编程中常犯的。 

  一个利用缓冲区溢出而企图破坏或非法进入系统的程序通常由如下几个部分组成: 

  1.准备一段可以调出一个shell的机器码形成的字符串,在下面我们将它称为shellcode。 

  2.申请一个缓冲区,并将机器码填入缓冲区的低端。 

  3.估算机器码在堆栈中可能的起始位置,并将这个位置写入缓冲区的高端。这个起始的位置也是我们执行这一程序时需要反复调用的一个参数。 

  4.将这个缓冲区作为系统一个有缓冲区溢出错误程序的入口参数,并执行这个有错误的程序。 

  通过以上的分析和实例,我们可以看到缓存溢出对系统的安全带来的巨大威胁。在unix系统中,使用一类精心编写的程序,利用suid程序中存在的这种错误可以很轻易地取得系统的超级用户的权限。当服务程序在端口提供服务时,缓冲区溢出程序可以轻易地将这个服务关闭,使得系统的服务在一定的时间内瘫痪,严重的可能使系统立刻宕机,从而变成一种拒绝服务的攻击。这种错误不仅是程序员的错误,系统本身在实现的时候出现的这种错误更多。如今,缓冲区溢出的错误正源源不断地从unix、windows、路由器、网关以及其他的网络设备中被发现,并构成了对系统安全威胁数量最大、程度较大的一类。

来源:http://tieba.baidu.com/f?kz=161505233

活动纪录(Activation Records)
  每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack),是目前最常用的缓冲区溢出攻击方式。
函数指针(Function Pointers)
  函数指针可以用来定位任何地址空间。例如:“void (* foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe程序。
  长跳转缓冲区(Longjmp buffers)
  在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。
------

一般溢出的数据都是精细构造的,里面有可执行的代码。栈或者堆溢出,足够长的数据,正好覆盖了别的可执行代码或者栈里压的CS、EIP之类的指针。
溢出数据里往往有小段调用HTTP下载木马或者取得远程Shell(比如CMD、netcat)的代码,溢出时JMP或RET到那,被直接被执行了。
也有像JPEG组件溢出直接读入JPEG里保存的二进制数据并JMP,不过不太多见。

缓存溢出获得root权限:

如果发生缓冲区溢出的程序本来就是有root权限的像很多的系统服务或者内核, 你当然就有了一个root权限的shell, 如果溢出发生在一个普通权限的程序中, 你照样只有一个很低权限

来源:http://topic.csdn.net/u/20110819/19/45c926e3-6a2b-4e90-96ee-d4ebd72a1d7c.html?r=75064326

原创粉丝点击