奥鹏作业分忧网

主页 > 奥鹏作业答案

东北大学17秋学期《采矿学上》在线作业1

摘 要:长期以来,缓冲区溢出攻击已经成为系统软件和应用软件的一个重要安全问题。利用服务器缓冲区漏洞进行攻击时目前网络黑客进行攻击的重要手段之一。那么,什么是缓冲区溢出?为什么缓冲区溢出是系统程序存在的重要安全隐患?网络服务提供者该对系统做出怎样的防护,才能将利用缓冲区溢出进行攻击的入侵者阻止在他们的服务器之外?
  关键词:缓冲区溢出 函数指针 长跳转缓冲区 代码植入
  
  缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢出漏洞太普通了,并且易于实现。而且,缓冲区溢出所以成为远程攻击的主要手段,其原因在于缓冲区溢出漏洞给予了攻击者所想要的一切:殖入并且执行攻击代码。被殖入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。本文简单介绍了缓冲区溢出的基本原理和预防办法。
  
  一、缓冲区溢出的概念
  当正常的使用者操作程序的时候,所进行的操作一般不会超出程序的运行范围;而黑客却利用缓冲长度界限向程序中输入超出其常规长度的内容,造成缓冲区的溢出从而破坏程序的堆栈,使程序运行出现特殊的问题转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数,属于程序开发过程考虑不周到的结果。
  缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞普遍并且易于实现。而且缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
  
  二、缓冲区溢出的漏洞和攻击方式
  缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。它的具体实现过程是这样的:首先攻击者对ROOT程序进行试探性攻击,然后执行类似“exec(sh)”的执行代码来获得具有root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:
  1、在程序的地址空间里安排适当的代码;
  2、通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。
  根据这两个目标来对缓冲区溢出攻击进行分类,缓冲区溢出攻击分为代码安排和控制程序执行流程两种方法:
  1、在程序的地址空间里安排适当的代码的方法:植入法或者利用已经存在的代码。
  2、控制程序转移到攻击代码的方法:
  所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。
  分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程序空间的突破和内存空间的定位不同。主要有以下三种:
  1、活动纪录:
  每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击,是目前最常用的缓冲区溢出攻击方式。
  2、函数指针(Function Pointers):
  函数指针可以用来定位任何地址空间。例如:“void (* foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。
  3、长跳转缓冲区(Longjmp buffers):
  在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。
  
  三、缓冲区溢出的防范措施
  缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击使得一个匿名的用户有机会获得一台主机的部分或者全部控制权,危害巨大。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。下面提供了集中预防缓冲区溢出的防范措施。
  1、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。通过使被攻击主机的运行程序的数据段地址空间不可执行,从而使得攻击者不可能植入被攻击程序输入缓冲区的代码。为了保持系统程序的兼容性,不可能使得所有程序的数据段不可执行,但是可以设定堆栈数据段不可执行,这样就可以保证程序的兼容性。
  2、从程序初期就强制写正确的代码。在程序编写时以免错误发生最原始的方法就是用gerp来找出源代码中较容易产生的漏洞的库的调用。通过查错工具对人为随时产生的缓冲区溢出安全漏洞进行纠查改正,可以让编写时缓冲区溢出的漏洞更少一点,而完全的没有则是不现实的。
  3、利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除缓冲区溢出的威胁。数组边界检查能防止所有的缓冲区溢出的产生和攻击。为了实现数组边界检查,则所有的对数组的读写操作都应当被检查以确保对数组的操作在正确的范围内。最直接的方法是检查所有的数组操作,但是通常可以采用一些优化的技术来减少检查的次数。
  
  四、结束语
  单一的方法并不能完全阻止所有类型的攻击,但各类方法之间并不相互排斥,所以只有综合应用各类方法,才能达到最佳的防御效果,这也是这个领域未来的研究目标。笔者认为,如果能和访问控制、入侵检测等技术相结合,则能进一步提高网络和系统的安全性。
  
  参考文献:
  [1]李海燕.缓冲区溢出机理分析及防范措施.网络安全技术与应用.
  [2]单征等.网络黑洞攻击与防范指南.中国电力出版社.
  [3]蒋卫华,李伟华,杜军.缓冲区溢出攻击,原理,防御及检测.计算机工程.□
 

(责任编辑:admin)
要这答案加QQ:800020900 或加微信:apzy123 获取

    提示信息×