缓冲区溢出攻击的原理分析与防范
- 格式:ppt
- 大小:1.61 MB
- 文档页数:22


论缓冲区溢出攻击的分析和防范策略章三平龚玉兰(南昌市工业技术研究院,江西南昌330006)摘要:本文主要针对缓冲区所产生的网络安全漏洞等问题进行分析和研究,并对如何维护网络的安全和稳定,保护计算机内数据信息不被外界攻击者攻击破坏而带来不便进行探讨。并重点论述如何加强对缓冲区的注重和保护,如何对产生的网络安全问题进行及时的防范和解决。关键词:缓冲区;缓冲区溢出;网络安全;防范策略1引言缓冲区溢出是一种常见且危害很大的系统攻击手段,通过向程序的缓冲Ⅸ写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈使程序转『硎丸行其它指令,以达到攻击的目的。2缓冲区溢出攻击原理分析2.1缓冲区溢出的概念和原理缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。这样想下去的话,如果说要给程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方,这就不是什么好现象了。仅仅就单个的缓冲区溢出惹眼,它并不是最大的问题根本所在。但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。2.2攻击原理引起缓冲区溢出问题的根本原因是C(与其后代c++)本质就是不安全的,没有边界来检查数组和指针的引用,也就是开发人员必须检查边界(而这一行为往往会被忽视),否则会冒遇到问题的风险。标准c库中还存在许多非安全字符串操作,包括:strcpy0、spnnff0、gets0等。当程序写入超过缓冲区的边界时,这就是所谓的“缓冲区溢出”。发生缓冲区溢出时,会覆盖下一个相邻的内存块。由于C语言本质上的不安全性,所以它允许程序随意(或者更准确地说是完全出于偶然)溢出缓冲区。没有运行时检查来这一防止写入超过缓冲区末尾,所以程序员必须在其自己的代码中执行这一检查,否则继续下去会出现问题。缓冲区溢出的副作用取决于:(1)写入的数据中有多少超过缓冲区边界(2)当缓冲区已满并且溢出时,覆盖了哪些数据(如果有的话)(3)程序是否试图读取溢出期间被覆盖的数据(4)哪些数据最终替换被覆盖的内存一般情况下,覆盖其它数据区的数据是没有意义的,最多造成应用程序错误,但是,如果输入的数据是经过“黑客”精心设计的,覆盖缓冲区的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。此外,攻击者利用缓冲区溢出得到机器上的交互式会话(sheU)。如果被利用的程序以较高的优先权在运行(如root用户或管理员),则攻击者就会在交互式会话中得到该优先权。最惊人的缓冲区溢出是堆栈的摧毁,它会在超级用户或root、shell中造成后果。许多可以利用脚本都能在网络上找到,它们对特定体系结构上的堆栈进行摧毁。2-3缓冲区溢出漏洞攻击方式最常见的攻击手段是通过制造缓冲区溢出使程序运行一个用户sheU,在通过sheH执行其它命令.若该程序输入root且有suid权限的话,攻击者就获得了一个有root权限的sheU,此时就可以对系统进行随意操作了。下面主要介绍一下如何控制程序跳转到攻击代码:2.3.I打开记录(ActivationRecordsl在程序中,每一个函数调用发生,在堆栈中会留下一个ActivationRecords,它包括函数结束时返网的地址,攻击者通过溢出这些自动变量,使地址指向攻击程序代码.通过改变程序的返回地址,当调用结束时,程序就跳到攻击者设定的地址,而不是原地址.这类溢出被称为stacksmashingattack。2.3.2函数指针FunctionPointemlvoid(*foo)(1)定义一个返回函数指针的变量foo,FunctionPointers可用来定位任何地址空间.所以只需在任何空间内的FunctionPointers附近找到一个能溢出的缓冲区,然后溢出它来改变FunctionPointers.在某时刻,当程序通过FunctionPointers调用函数时,程序的流程就按黑客的意图实现了(典型的溢出程序有:Linux下的Superprobe程序)o2.3.3长跳转缓冲区(h画mpbu如rs)在c语言中,包含了一个简单的检验/恢复系统,称为setjmp/longjmp.即在枪验点设定setjmp(buffer),用longjmp(buffer)恢复.但若攻击者能够进入缓冲区空间,则longjmp(buffcr)实际上跳转到攻击者的程序代码.像FunctionPointers,longjmp缓冲区能指向任何地方,所以攻击者要做的就是找到一个可供溢出的buffer即可。3缓冲区溢出的防范策略缓冲区溢出攻击通常是在一个字符串里综合了代码植入和激活纪录。如攻击者将目标定为具有溢出漏洞的自动变量,然后向程序传递超长的字符串,进而引发缓冲区溢出。经过精巧设计的攻击代码以一定的权限运行漏洞程序,获得目标主机的控制权。这种攻击手段屡次得逞主要是利用了程序中边境条件、函数指针等设计不当问题,即利用了c程序本身的不安全性。大多数Windows、Linux、Unix系列的开发都依赖于C语言,所以缓冲区溢出攻击成为操作系统、数据库等应用程序最普遍的漏洞之3.1编写正确的代码编写正确的代码是一件非常有意义但耗时的工作,特别象编写C语言那种具有容易出错倾向的程序(如:字符串的零结尾),这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。为了寻找一些常见的诸如缓冲区溢出和操作系统竞争条件等漏洞,代码检查小组检查了很多的代码。然而依然有漏网之鱼2008年第6期1
羹 一 #中国j .}技术企业
浅析缓冲区溢出攻击技术以及防范策略
◇文/李大光
【摘要】 本文首先解释了缓冲区及缓冲区溢出的概念,通过一个会导致缓冲区溢出的程序对缓冲区溢出 攻击的产生进行了实例分析;综述缓冲区溢出攻击防范策略。 【关键词】网络安全缓冲区溢出攻击防范策略
一缓冲区溢出攻击技术 1.1缓冲区溢出防范技术简介 随着基于Intemet的网络技术的发展.计算机病毒和网上黑客对 Intemet的攻击越来越激烈,网络安全问题日益严重。各种网络攻击 技术中,缓冲区溢出对计算机系统造成的危害最大。历史上最著名 的缓冲区溢出攻击可能要算是1988年11月2日的MorrisWorm(莫 尔斯蠕虫)了。它可以使攻击者有机会获得一台主机的部分获全部 的控制权,因此采取有效的检测防范措施是十分必要的。 1.2缓冲区溢出漏洞攻击实例 下面我们就列举一个简单的缓冲区溢出的例子: stackl,C #include<stdio.h> intmain(intargc,char* argv)( charbuf[1O]; strcpy(buf,argv【1]); printf(”Thestringis%skn”,bur); retumO; } 这是一个存在缓冲区溢出漏洞的程序。先构造一个10BYTES的 BUFFER数组,然后把命令行的第一个参数拷贝进缓冲区,由于在使 用s ̄cpy()函数时,缺乏对数组边界的检查,当参数argv[1]长度超过 10BYTKS时,就会造成缓冲区溢出,具体操作: ¥>stackl、AAAAAAAAAA、 当覆盖10BYTES的“A”时,程序正常退出。 ¥>stack1、AAAAAAAAAAAAAAAAAAAAAAAA、 n1estrin sAAAAAAAAAAAAAAAAAAAAAAAA 当覆盖24BYTES的“A”时,程序仍然能够正常退出。 ¥>stackl、AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA SEGMENTFAUI 当覆盖32BYTES的“A”时,程序出现了段错误提示。 覆盖10BYTES的“A”时,程序正常退出,24BYTES也是如此,直 到32BYTES时,发生SEGMENTFAULT。下面用GDB工具调试程序, 看看产生的原理。 Dumpofassemblercodeforfunctionmain: 0x08O4835c<main+00>:push%ebp 0x08O4835d<main+O1>:mo ̄%esp.%ebp Ox08O4835f<main+03>:subS0xl8.%esp 0]【O8o48362<main+06>:and¥o】【 .%esp OxO8O48365<main+09>:mo ̄¥OxO.%tax 0x0804836a<main+14>:sub%tax.%esp Ox08O4836c<main+16>:subS0x8.%esp 0]【08o4836f<main+19>:movOxc(%ebp1,%tax 0]【O8O48372<main+22>:add¥Ox4.%COX
83
2008.3
计算机安服 务病毒黑客
1 引言缓冲区是程序员为保存特定的数据而在计算机内存中预分配的一块连续的存储空间。缓冲区溢出就是在向缓冲区填充数据时,程序员因为疏于检查缓冲区边界,导致填充的数据超过预先分配的缓冲区数量,致使溢出的数据覆盖在合法数据上而引起系统异常的一种现象。如果缓冲区溢出造成的后果仅仅是覆盖掉其他区域中没有意义的数据,或者仅仅造成软件错误倒也罢了,危险的是:一些高明的“黑客”或者病毒制造者,就是利用这种系统漏洞,精心编制出“木马”程序或者病毒,伴随覆盖缓冲区的数据侵入被攻击的电脑,造成系统破坏、数据泄密等种种危害,给用户造成重大的损失。近几年的统计表明,基于缓冲区溢出漏洞的攻击占了远程网络攻击的绝大多数,比如红色代码、Slammer蠕虫病毒和冲击波病毒都是基于缓冲区溢出漏洞攻击的典型代表。本文主要剖析“黑客”利用缓冲区溢出机制进行系统攻击的主要工作原理,并简要分析一下应对缓冲区溢出攻击的防范策略。2 缓冲区溢出攻击的工作原理
图1 计算机程序内存存放示意图为了搞清楚“黑客”基于缓冲区溢出漏洞攻击的工作原理,我们先来分析一下计算机程序在内存中的存储和运行方式,计算机程序在内存中通常分为[1]程序段、数据段和堆栈3部分,其具体存放策略如图1[2]所示,程序段存放的是可执行的二进制机器代码或者只读数据,这个段的内容只允许读或者执行操作,不允许写操作,因而不会造成溢出的发生。数据段中同时包括静态分配的内存(比如全局静态数据)和动态分配的内存(比如堆),静态数据和堆也会有溢出而且产生危害,但一般较少,最常见的攻击是堆栈带来的。堆栈中存放程序执行过程中的动态数据,在高级语言中,函数调用和函数中的临时变量都用到堆栈。参数的传递和返回值也用到了堆栈。每当调用一个函数,就会使用一个新的堆栈帧来支持该调用,主要功能是当程序执行过程中调用函数和方法时,用来记录函数完成之后的返回位置,存储函数中使用的本地变量,向函数传递参数,以及从函数返回值的保存。我们通过下面buffer_example.c程序中的函数调用实例来诠释一下当程序中调用函数时,堆栈的工作机理和堆栈溢出的根源。buffer_example.c: void function(char x, char y, char z) { char variable1[4]; char variable2[12]; } void main() { function(‘a’,’b’,’c’);}在上面所示的程序中,当在主程序中调用函数function时,计算机缓冲区溢出攻击的工作原理及防范策略殷立峰(山东政法学院,山东 济南 250014)摘 要:该文主要分析了堆栈的“黑客”利用缓冲区溢出机制进行系统攻击的主要工作原理,并简要分析一下应对缓冲区溢出攻击的防范策略。关键词:堆栈;缓冲区溢出;防范策略 Working Theory of Aggression Based on Buffer Overflow and Defence SchemeAbstract:This paper mainly analyzes the Working Theory of Aggression Based on Buffer Overflow that hacher used to aggress computer system , It also provider several defence schemes according to the advantage of Aggression Based on Buffer Overflow.Key words: Stack; Buffer Overflow; Defence Scheme
缓冲区溢出分析与防御
—l1从Morris编写了第一个蠕虫病毒以来,缓冲区溢出 口 攻击已成为目前世界上最主要、最具威胁性的网络 攻击之一。据初步估计,美国每年因网络安全问题所造成的 经济损失高达75亿美元。在过去的10年中,利用缓冲区溢 出漏洞进行网络入侵占了网络攻击的70%以上。因此,深入 研究缓冲区溢出的原理、其植入代码的结构特征,以及如何 防范缓冲区溢出具有重要的意义。 缓冲区溢出内存模型和分类 缓冲区溢出的根本原因有两点:(1)缺少必要的边界检 查。在C/C十+等高级语言当中,数据被写入到缓冲区的时候, 并不做边界检查。这样,一旦被复制的数据长度超过了缓冲 区的大小,就必然会导致缓冲区溢出。(2)操作系统设计策 略的隐患。这主要是指栈和堆数据区的可执行属性。Unix和 Windows系统为了更好的性能和功能,往往在数据段当中动态 放入可执行的代码,以保证程序的兼容『生,从而使得堆和栈 具有可执行属性。但是,赋予栈和堆的可执行属性并不是必 要的。因为栈和堆的本质功能只是用来存储数据,对其赋予 可执行权限对系统的安全性带来了不可避免的安全隐患。 在继续进行缓冲区溢出分析之前,先给出缓冲区溢出的 内存模型和常见缓冲区溢出攻击的分类。 (一)缓冲区溢出内存模型 我们以针对栈的缓冲区溢出进行说明。针对堆的缓冲区 溢出形式并不相同,但是其基本思想是一致的。 在某些高级语言,例如C程序中,每当调用函数时,就 会自动处理堆栈分配。堆栈起到了保存有关当前函数调用上 下文的容器的作用。许多内容都可能进入堆栈区,通常其内 容与计算机体系结构和编译器相关。一般而言,如下内容都 将被储存在堆栈中:函数的非静态局部变量值、堆栈基址、当 函数返回时程序应该跳转到的地址以及传递到函数中的参数。 当发生函数调用时,编译器所执行的步骤如下: (1)调用者。首先,调用者将被调用的函数所需的所有 参数都压入堆栈,之后堆栈指针自动更改到指向当前栈顶。 接着随系统不同,调用者可能压入一些其它数据来保护现 场。完成后,调用者使用调用指令来调用函数。调用指令将 返回地址(IP)压入堆栈,并相应更新堆栈指针。最后,调用 指令将程序计数器设置为正被调用的函数地址,执行权交给 张君 被调用函数。进入第(2)步操作。 (2)被调用者。首先,被调用者将BP寄存器内容压入堆 栈来保存调用者的堆栈基址,并更新堆栈指针到旧的基址。 设置BP内容为自己的堆栈基址,亦即当前的堆栈指针。然 后,被调用者按照局部变量的声明移动堆栈指针,为所有非 静态局部变量分配足够的空间。执行被调用函数的操作。 (3)调用函数结束。当被调用函数执行完毕后,调用者 更新堆栈指针以指向返回地址IP,调用ret指令将程序控制 权交给返回地址上的程序。然后恢复被保存的运行环境。 从以上的过程中可以看到,发生函数调用时的堆栈分配 过程中,非静态局部变量缓冲区的分配和填充不是同时进行 的,并且依据不同的标准:局部变量缓冲区的分配是依据局 部变量的声明,而填充则是依据其实际被赋予的值。因此这 个过程中就出现了安全漏洞。图1说明了被调用函数执行时 的堆栈情况。 内存高端