C语言源程序的缓冲区溢出漏洞分析及解决方案

更新时间:2023-05-16 06:14:02 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第22卷 第3期沈 阳 化 工 学 院 学 报

JOURNALOFSHENYANGINSTITUTEOFCHEMICALTECHNOLOGY

2008.9

Vol.22 No.3

Sep.2008

文章编号: 1004-4639(2008)03-0265-04

C语言源程序的缓冲区溢出漏洞分析及解决方案

刘 俊, 张 枫

(沈阳化工学院计算机科学与技术学院,辽宁沈阳110142)

摘 要: 着重分析一些存在缓冲区溢出攻击漏洞的C语言函数,介绍具有哪些特点的C函数容易受到缓冲区溢出攻击,并借此更加深入地了解缓冲区溢出攻击机制.探讨了缓冲区溢出攻击程序的结构.最后提出避免缓冲区溢出攻击的方法.该方法从C函数和攻击程序两方面入手,通过避免或正确使用有缓冲区溢出攻击漏洞的C语言函数;了解恶意程序代码的结构识别恶意程序代码,达到避免缓冲区溢出攻击的目的.关键词: 缓冲区; 溢出; 安全攻击

中图分类号: TP393108 文献标识码: A

缓冲区溢出攻击一直以来都是黑客攻击的主要手段,其原因很大程度上取决于C或C++程序中的许多存在缓冲区溢出漏洞的函数.这些漏洞导致缓冲区溢出相对于其他攻击方式容易实现.缓冲区溢出攻击,轻者可导致计算机系统的混乱,重起或死机,更加严重的会使攻击者有机会得到被攻击主机的超级权限,从而控制主机,执行一些破坏行为.如:偷取重要资料,查看内部保密信息,篡改重要文件,删除有用的数据等等.但由于攻击者取得了被攻击主机的超级权限,他可以删除这台主机活动日志中的记录,使得他能够长期控制这台主机而且还不会被机主发现.其后果非常严重.研究过的相关问题未从C函数的细节剖析C语言的缓冲区溢出机制.本文借C语言中一些不安全的库函数的研究,从更细化方面来深入地说明缓冲区溢出机制的原理,并就避免缓冲区溢出攻击提出一些建议和意见.

[1]

存低地址到高地址依次为:代码段,数据段,堆栈段.其中代码段顾名思义存放的是程序)))机器码和一些只读数据;数据段存放的则是程序中的静态数据;堆栈段存放的是程序中的动态数据,包括一些局部变量,函数中传递的参数等[2].缓冲区溢出就是利用程序在内存堆栈段的溢出来实现的.堆栈的增长方向与内存的方向相反.栈底是内存的高端,栈顶则是内存的低端.栈底指针是不会改变的,出入栈时都是从栈顶进行,即栈顶指针在变化,满足栈的后进先出原则.

当一个函数被调用时,栈中的变化如下:首先将参数入栈;其次是指令寄存器中的EIP作为函数返回地址入栈;然后将基址寄存器中的EBP入栈,最后将所调函数中的局部变量入栈,同时将栈顶指针减去局部变量所用的空间作为新的栈顶[2].以下的代码1:主函数main调用函数function并造成数组越界的过程[3].

#include<stdio1h>#include<string1h>voidfunction(char*str){

charbuffer[1]; strcpy(buffer,str);

1 C函数的分析

111 C语言中函数的存储及执行

函数在内存中的存储,大致分为三段.由内

收稿日期: 2007-05-07

作者简介: 刘俊(1971-),男,辽宁沈阳人,副教授,硕士,主要从事计算机网络方面的研究.

266沈 阳 化 工 学 院 学 报 2008年

printf(d%s\nd,buffer);}

voidmain(){

charstr[16]={.a.,.a.,.a.,.a.,.a.,.a.,.a.,.a.,.a.,.a.,.a.,.a.,.a.,.a.,.a.,0};

function(str);

}

当主函数调用function时先将str参数入栈,而后是指令寄存器EIP,基址寄存器EBP,最后将function函数中的局部变量buffer入栈.当执行strcpy函数的时候,要将参数str传过来的16个字符送入字符数组长度仅为1的buffer中.此时会产生数组越界,即buffer这个缓冲区溢出了!具体描述如图1所示

.

char*strcpy(char*dst,constchar*src){

char*address=dst;

while(*dst++=*src++); returnaddress;

}

代码3:C库函数中的strcat函数原型char*strcat(char*dst,char*src){

char*cp=dst; while(*cp)

++cp; /*Findtheendofdst*/ while(*cp++=*src++) /*Copysrctotheendofdst*/

returndst;}

11211 stropy函数

代码2是C库函数中的stropy函数.函数功能是将源串src传入到目的串dst中.实现此功

图1 代码1调用function函数时的内存变化

由于buffer只申请了一个单位的空间,向buffer传数据时多余的15个字符将沿栈顶向栈底压入,填充并覆盖了EBP,EIP和str的内容.注意此时EIP的内容被改变了!如果攻击者将这个缓冲区溢出后,将EIP的内容填充为一段恶意代码的地址,那么当程序溢出后便会立即跳到这段已经准备好的恶意代码处去执行.这时攻击者的企图便得逞了.

观察并调试过以上程序后,可以了解到,程序中引用的strcpy函数并没有对所操作的参数buffer的边界进行校验,而是直接不加判别的将str中的数据传了过去,包括str的结束标志.正是由于有这种漏洞的存在,才使C或C++中缓冲区溢出攻击有可乘之机.在程序连接和编译的时候都没有给出出错信息,直到程序执行时才可以使程序员意识到这样的一个错误存在.C语言数组的越界问题在其他文献中也有详细提及

[4]

能用了一个while语句,其中将src中的每个元素赋给了dst的元素.在判断时仅仅判断了src串是否结束,如果结束就结束循环.而并没有判断dst串是否结束,没有判断dst是否到了临界边缘.导致即使dst的长度小于src,函数仍允许src赋值给dst.则dst这个缓冲区被溢出了!这个不判断结束边界的函数存在着缓冲区溢出漏洞.

11212 strcat函数

代码3是C库函数中的strcat函数.函数功能是将源串src接到目的串dst的后面.虽然在第一个while语句中函数判断了cp即dst的边界,但结束后,在第二个while中还是继续将src中的字符赋给cp.很明显,第一个while判断cp是否结束,并不是考虑到会溢出,而只是想让src接在dst的尾部.那么同样cp缓冲区被溢出了!所以此函数也存在漏洞.

综上两个C函数,可以清晰地看到,最直接的导致缓冲区溢出的函数漏洞就是对变量不进行边界校验.当堆栈溢出时覆盖了栈低端的其他空间尤其是指令寄存器中的EIP.诸如此类的C函数还有许多,在此不一一列举.

.对C语言中的一些导致缓冲区漏洞的典

型函数的源代码及漏洞根源作一讨论.112 存在漏洞的C函数(strcpy和strcat)

2 缓冲区溢出机制

缓冲区溢出机制:人为利用某些C函数不进行边界校验的漏洞,使缓冲区溢出.攻击者利用一段已有的恶意代码或者自己编写的恶意代码(Shellcode),当使堆栈的缓冲区溢出后,用已准备好的恶意代码的地址来覆盖EIP地址,使程序转去执行恶意代码,达到攻击的目的.一般的恶意代码结构如图2所示

.

3 结束语

以上描述了攻击者如何利用缓冲区溢出机制编写恶意代码,进行缓冲区溢出攻击.针对这些特征及攻击手段,防御的主要方向有以下几方面.

(1)既然C库函数中的某些函数是存在漏洞的,也了解到哪些类型的函数存在这种漏洞及存在漏洞的原因,就应在编程期间有意识的避免这样程序的出现,可以在这些C库函数的基础上做一下安全的改进或者干脆就用其他安全的库函数代替.如:strncpy就可以完全代替strcpy函数;可以用strncat代替strcat;用snprintf代替sprintf,,

(2)着重注意检查边界是否越界,并及时改正.

(3)注意随时监测外部输入的数据:(A)如果数据中有较多的无意义指令NOP,AAA等,要注意,提高防范缓冲区溢出攻击的警惕,确定遭遇攻击时的防范手段.如给出异常信息等.(B)如果数据中有连续且重复的内存地址时也同样要提高警惕,对于异常信息给出异常处理.

随着科技水平的不断提高,攻击和防范的手段都在不断的改进.关于网络安全方面一向是先遭到攻击再找出相应的解决办法.其实最好的防范手段就是不断地了解攻击的方法,在被攻击之前做好防御工作,使攻击者无从下手.

图2 恶意代码的结构

由于攻击者没办法精确地掌握被缓冲程序堆栈中Shellcode的具体位置,所以为加快攻击速度,加强攻击准确性,会在Shellcode前面加一段较长的无意义操作指令(sledge),这样即便被改变后的EIP不能确切地指向Shellcode的位置,也可以通过加长sledge段来确保EIP指到Shellcode前面,确保程序最终会无误的执行到Shellcode代码.图2为恶意代码的结构,其中:

11NNN,(sledge)是一段无实际意义,用来占位的指令如NOP,还有许多指令可以代替NOP.诸如:AAA,AAS,CLC,CLD,CMC等指令.

21Shellcode是完成攻击的主要执行部分.执行后可以得到一个系统Shell.如果存在漏洞的程序是以root为权限运行的,那么攻击者就会得到有root权限的shell,则被攻击主机将完全被攻击者控制.

Shellcode中含有一系列系统调用,如:exec(),system(),socket(),setuid(),open(),,.通过这些系统调用,攻击者可以修改权限,获得shell等等.

31RARA,即为攻击者希望能够覆盖EIP准备好的返回地址.为了提高命中率,这一段通常连续且重复.

参考文献:

[1] 程琼,李王旬.C语言程序设计中的缓冲区溢出问题

[J].安徽教育学院学报,2005,23(3):47.

[2] 尚明磊,黄皓.缓冲区溢出攻击的分析与实时监测

[J].计算机工程,2005,31(12):36.

[3] 谭浩强.C程序设计[M].2版.北京:清华大学出

版社,1999:143.

[4] 牛连强,张起栋.关于C语言中若干问题的探讨

[J].沈阳工业大学学报,1998,20(3):45.

LoopholesAnalysisandSolvedSchemeofBufferOverflow

AttacksonCLanguageFunction

LIUJun, ZHANGFeng

(Shenyanginstituteofchemicaltechnology,Shenyang110142,China)

Abstract: ThebufferoverflowattackloopholesareemphaticallyanalyzedinsomeClanguagefunctions.ItintroducesthecharacteristicsthattheCfunctionsareeasilyattacked,enablesthebufferoverflowmech-anismandmakesmoreclearlybyanalyzingthestructureoftheevilattackprogram,andfinallysomemethodsthatcanavoidthebufferoverflowattackareproposed.Themethodsstartwithtwoaspects:TheCfunctioncanavoidtheattackprogramthroughavoidingattackorcorrectlyusingtheClanguagefunc-tionthathasbufferoverflowloopholes;Thestructureoftheevilintentionprogramisunderstoodandrec-ognized.Themethodfinallyachievesthegoaltoavoidthebufferoverflowattack.Keywords: buffer; overflow; attackloophole(上接第242页)

AcousticTransmittingCharacteristicsinGas-Oil

Two-phasePipelineFlowing

BAOR-idong, BIWen-jun, TANGL-iming

(ShenyangInstituteofChemicalTechnology,Shenyang110142,China)

Abstract: Basedonthedefinitionofacoustictransmittionandvolumeelasticmodule,atwo-phasefluid

elasticmoduleavoidedfromthedivisionofcomplextwo-phaseflowpatternandtheacousticspeedunderaspecifiedflowpattern.Awidelyusefulacoustictransmittingformulawasderivedinagas-oiltwo-phasemedium,andthensimplifiedaccordingtorespectivedensityofthetwophasefluid,voidfraction,stateofthermalexchange,toughnessinpipelineandthedifferencesofrestrictingconditions.Theanalysisofa-cousticspeedinflowingfluidthatvaryedwiththevoidfraction,andtheflowingpressureandtheoilchar-acteristicshasdone.Conclusionswereobtainedfromtheresultsinahelpfulforthestudyofhydraulictransientingas-oilpipelinetransportation.Keywords: two-phaseflow; acousticspeed; voidfraction; acoustictransmittingcharacteristics;numericalcalculation

本文来源:https://www.bwwdw.com/article/m4c4.html

Top