C语言源程序的缓冲区溢出漏洞分析及解决方案
更新时间:2023-05-16 06:14:02 阅读量: 实用文档 文档下载
- c语言缓冲区溢出代码推荐度:
- 相关推荐
第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
正在阅读:
建筑装饰装修施工组织设计方案05-02
电动剃须刀前盖模具设计及其型腔仿真加工01-22
元旦恋人表白02-24
苏教版小学科学五年级下册单元测试题 全册01-20
武汉大学新闻院金秋人员名单01-19
预算会计复习资料312-22
浙江舟山南洋船业公司8万吨级舾装码头工程施工监理实施细则23p08-17
新华都招赘唐骏的美丽野心09-11
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 漏洞分析
- 缓冲区
- 源程序
- 溢出
- 解决方案
- 语言
- 2016国家公务员面试成功 人际交往能力必不可少
- 住建局2011年党风廉政建设工作总结及
- 初中生物实验器材清单.
- 银行远程金库门禁系统标准方案
- 851第五章第一节 地球上水的物态变化
- 四年级庆祝春节作文2021
- 五网合一给力农村信息服务
- 山东专升本工程力学试卷6
- 学校综合治理总结
- 精彩作文开头赏析
- 腹腔镜胆总管切开取石的围手术期护理体会
- 美国服装企业的营销系统
- 麦肯锡的专业市场调研方法
- 专升采矿毕业设计
- 蛋白激酶C-细胞外信号调节激酶12通路介导精氨酸升压素对成年大鼠心肌成纤维细胞的促增殖作用
- 人称代词、物主代词、反身代词及名词所有格的用法
- 出千色子赌具-课堂互动教学模式在高中英语教学中的运用
- 党员IC卡管理信息系统
- 沪科版物理高一上1-E《速度变化的快慢 加速度》学案7
- 碳酸钠和碳酸氢钠的性质学案