(计算机应用技术专业论文)基于gcc的缓冲区溢出检测研究.pdf_第1页
(计算机应用技术专业论文)基于gcc的缓冲区溢出检测研究.pdf_第2页
(计算机应用技术专业论文)基于gcc的缓冲区溢出检测研究.pdf_第3页
(计算机应用技术专业论文)基于gcc的缓冲区溢出检测研究.pdf_第4页
(计算机应用技术专业论文)基于gcc的缓冲区溢出检测研究.pdf_第5页
已阅读5页,还剩70页未读 继续免费阅读

(计算机应用技术专业论文)基于gcc的缓冲区溢出检测研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

c l a s s i f i e di n d e x : u d c : ad i s s e r t a t i o nf o rt h ed e g r e eo f m e n g r e s e a r c ho nt h eb u f f e ro v e r f l o w t e c h n o l o g yb a s e do ng c c c a n d i d a t e : s u p e r v i s o r a c m e 商c d e g r e ea p p l i e df o r 。 s p e c i a l t y 。 d a t eo fs u b m i s s i o n 。 d a t eo fo r a le x a m i n a t i o n u n i v e r s i t y 。 w u n a n p r o f l ij i n g m e i m a s t e ro f e n g i n e e r i n g c o m p u t e ra p p l i e dt e c h n o l o g y j a n u a r y ,2 010 m a r c h ,2 0 1 0 h a r b i ne n g i n e e r i n gu n i v e r s i t y 哈尔滨工程大学 学位论文原创性声明 本人郑重声明:本论文的所有工作,是在导师的指导下, 由作者本人独立完成的。有关观点、方法、数据和文献的引用 已在文中指出,并与参考文献相对应。除文中已注明引用的内 容外,本论文不包含任何其他个人或集体已经公开发表的作品 成果。对本文的研究做出重要贡献的个人和集体,均已在文中 以明确方式标明。本人完全意识到本声明的法律结果由本人承 担。 作者( 签字) :霉桷 日期: 力o i ) 年7 月门日 哈尔滨工程大学 学位论文授权使用声明 本人完全了解学校保护知识产权的有关规定,即研究生在校 攻读学位期间论文工作的知识产权属于哈尔滨工程大学。哈尔滨 工程大学有权保留并向国家有关部门或机构送交论文的复印件。 本人允许哈尔滨工程大学将论文的部分或全部内容编入有关数据 库进行检索,可采用影印、缩印或扫描等复制手段保存和汇编本 学位论文,可以公布论文的全部内容。同时本人保证毕业后结合 学位论文研究课题再撰写的论文一律注明作者第一署名单位为哈 尔滨工程大学。涉密学位论文待解密后适用本声明。 本论文( 口在授予学位后即可口在授予学位1 2 个月后 口 解密后) 由哈尔滨工程大学送交有关部门进行保存、 作者( 签字) :买确 导师( 签字) 日期:劢胗年弓月) 芦劢p 年月 1 , j 哈尔滨工程大学硕士学位论文 摘要 随着网络的蓬勃发展,计算机软件得到了长足的发展,它在社会的各个 领域得到了广泛的利用。同时,这些软件程序存在着一些安全漏洞。缓冲区 溢出漏洞就是最明显的一个。 本文基于g c c 编译器,在深入研究分析静态检测、动态检测方法基础上, 提出两种方法结合的的缓冲区溢出漏洞检测方法。 静态检测方法参照了整数对与建模分析方法,提出对每个缓冲区s 绑定 两个属性a l l o c ( s ) 与l e n ( s ) 。它跟踪每个缓冲区的两个属性a l l o c ( s ) ,l e n ( s ) 从而 判断是否发生了缓冲区溢出。 动态检测方法首先实现了分离局部变量的双栈结构。其次,在双栈结构 基础上实现了动态检测,这样可以防止多个函数之间的局部变量发生覆盖。 最后,将局部变量重新排序,这样可以防止单个函数的局部变量内部发生覆 j 血。 本文通过修改g c c 的语法分析文件,在函数调用和赋值语句这两块实现 了静态检测方法。实验表明,它可以检验出简单的指针操作所引发的缓冲区 溢出问题。通过修改g c c 的r t l 中间结构以及多个前端文件而最终实现了 动态检测方法。实验表明,它可以在发生溢出时候终止程序。由于时间有限, 重新分配局部变量这块没有在实验中验证。 关键词:c 语言;缓冲区溢出;静态检测;动态检测;g c c j 哈尔滨工程大学硕士学位论文 a b s t r a c t w i t ht h e d e v e l o p m e n t o fn e t w o r k s ,s o f f w a r e sh a v eb e e n d e v e l o p e d r a p l i d l y rh a sb e e nw i d e l yu s e di ne v e r yf i e l d so fs o c i e t y i nt h es a m et i m e ,t h e r e a r ep l e n t yo fs e c u r i t yf l a w si nt h ep r o g r a m b u f f e ro v e r f l o wi st h eo b v i o u so n e t i l i st h e s i si si nt h ep o i n tv i e wo ft h ec o m p i l e r h a v i n gd e p t ha n a l y s i so nt h e s t a t i ct e s ta n dd y n a m i ct e s t , i tp r o p o s e sd e t e c t i o nm e t h o dw h i c hi sc o m b i n a t i o no f b o t hm e t h o & a f t e rd r a w i n go np a r i so fi n t e r g e ra n dm o d e l m ga n a l y s i sm e t h o d s , t h i st h e s i sp r e s e n t sap o 缸o fv i e ww h i c hb i n dt h eb u f f e r sw i t ht w op r o p e r t i e s n a t n ea l l o ca n dl e n a l l o cr e p r e s e n t st h eb u f f e rs p a c ea l l o c a t e d i ng e n e r a l ,i ti s g a i n e db yac h a r a c t e ra r r a ya n dac h a r a c t e rp o i n t e r l e nr e p r e s e n t st h ep o s s i b i l i t y o ft h e u s eo fs p a c ei nt h i sb u f f e rz o n e t h i st h e s i st r a c ke a c ho ft h et w op r o p e r t i e s n a m e da l l o ca n dl e n 们1 et h e s i sw i l lt a k es o m es t e p st oa c h i e v et h i sg o a l f i r s t l y , i ta c h i e v et h et h e d u a ls t a c kw h i c hs e p a r a t et h el o c a lv a r i a b l e st oa n o t h e rn e ws t a c k s e c o n d l y ,i n t h en e ws t a c k , i ti n s e r taf l a gb e f o r el o c a lv a r i a b l e sa r ep u s h e di ni t l a s tb u tn o t t h el e a s t , b e f o r et h ee n do ft h ef u n c t i o n , t h et e s tw h e t h e rt h ef l a gh a sb e e n c h a n g e ds h o u l db et a k e n t h i sp r e v e n t st h ec o v e r a g eo fl o c a lv a r i a b l eb e t w e e n f u n c t i o n s b ym o d i f y i n gt h eg c cf r o n t - e n dp a r s i n go fd o c u m e n t st oe x t r a c tt h e r e l e v a n ta t t r i b u t ei n f o r m a t i o n ,t h et h e s i sc o m p l e t et h es t a t i ct e s ti nf u n c t i o nc a l l s a n da s s i g n m e n ts t a t e m e n t s e x p e r i m e n t ss h o wt h a ti tc a nt e s tas i m p l ep o i n t e r o p e r a t i o n s c a u s e db yb u f f e ro v e r f l o wi s s u e s b ym o d i f y i n gt h eg c cr t l i n t e r m e d i a t es t r u c t u r ea n dm u l t i p l ef r o n t - e n dd o c u m e n l s ,d y n a m i ct e s tg a i n e dt h e r e s u r e x p e r i m e n t ss h o wt h a ti tc a nt e r m i n a t et h ep r o g r a mw h e nb u f f e ro v e r f l o w o c c u r s i na d d i t i o n , l o c a lv a r i a b l e sc a na l s ob er e o r d e r e d a st h et i m ec o n s t r a i n t s , t h et h e s i sd o n tf i n i s ht h ee x p e r i m e n ta b o u ti t k e y w o r d s :cl a n g u a g e ;b u f f e ro v e r f l o w ;s t a t i ct e s t ;d y n a m i ct e s t ;g c c j 哈尔滨工程大学硕士学位论文 目录 第1 章绪论1 1 1 研究意义。1 1 2 研究现状3 1 2 1 静态检测技术3 1 2 2 动态检测技术5 1 2 3 其它方法。1 2 1 3 本文的工作1 4 第2 章缓冲区溢出原理1 5 2 1 溢出的原理1 5 2 2 缓冲区溢出分类1 5 2 3 缓冲区溢出的原因一2 l 2 4 本章小结2 2 第3 章g c c 编译器结构2 3 3 1 ( 配c 简介。2 3 3 2g c c 编译流程。2 4 3 3 语法树结构分析2 5 3 4r t l 结构分析2 7 3 5 本章小结。2 9 第4 章静态与动态结合的检测方法3 0 4 1 静态检测3 0 4 1 1 检测方法。3 0 4 1 2 生成约束条件3 4 4 1 3 安全检测3 5 4 2 动态检测3 5 4 2 1 基于双栈结构的动态检测3 6 4 2 2 对函数调用的影响3 9 4 3 本章小结4 0 第5 章测试与结果分析4 l 5 1 静态检测4 l 5 1 1 静态检测的实现4l 5 1 2 实验分析4 8 5 2 动态检测4 9 5 2 1 双栈结构4 9 5 2 2 基于双栈结构的动态检测5 5 5 2 3 实验效果6 0 5 2 4 实验分析6 3 哈尔滨工程大学硕士学位论文 5 3 本章小结。6 4 结论6 5 参考文献。6 6 攻读硕士学位期间发表的论文及取得的科研成果6 8 致谢。6 9 哈尔滨工程大学硕士学位论文 1 1 研究意义 第1 章绪论 近年来,随着网络的蓬勃发展,计算机软件得到了长足的发展,它在社 会的各个领域得到了广泛的利用。同时,病毒软件之类的恶意软件也伴随得 以传播。这些恶意软件通常是利用系统或者应用程序的漏洞获取相关权限进 而控制受感染的系统。这样就可以达到一些非法的目的,如盗取信息,破坏 数据等。 据美国c e r t c c ( c o m p u t e re m e r g e n c yr e s p o n s et e a m ) 统计 1 1 ,该组 织2 0 0 8 年全年收到的信息系统安全漏洞就多达7 2 3 6 个,自从1 9 9 5 年以来, 漏洞报告总数已达3 8 0 1 6 个,统计结果如下图: 漏洞数量 9 0 0 0 8 0 0 0 7 0 0 0 6 0 0 0 慧5 0 0 0 糖 曩4 0 0 0 3 0 0 0 2 0 0 0 1 0 0 0 o o u 口q i o o t 。 3 y 7 i :3 7 8 43 7 吵 2 4 3 7 。 一 一一一 i u 了u q 异口11odn4 1 7 - , a 一一一一。j ,一 - 一i , 1 9 9 51 9 9 61 9 9 71 9 9 81 9 9 92 0 0 02 0 0 12 0 0 22 0 0 32 0 0 42 0 0 52 0 0 62 0 0 7 年份 - 4 l - 漏洞数量 图1 1 累计的漏洞数量 缓冲区溢出漏洞在一些公布的系统漏洞和脆弱点中占很大比例。缓冲区 溢出攻击技术已经成为主流的网络攻击技术,具有使用广泛、难于防护、危 害性较大等特点。 臭名昭著的孀虫病毒【2 】就是利用了缓冲区溢出漏洞进行攻击的。自从第 一个蠕虫( m o r r i s 蠕虫) 产生以来,几乎每年都会有大量的爆发,具有极强 哈尔滨工程大学硕士学位论文 的破坏力。例如,2 0 0 0 年爆发的“爱虫 病毒。2 0 0 4 年4 月,震荡波( s a s s e r ) 病毒爆发,在短短几天时间内席卷全球,带来数千万美元损失。2 0 0 4 年1 月 底,y a h o o 、g o o o e 等搜寻引擎网站纷纷更受到m y d o o m 蠕虫的d d o s 攻击, 遭受了相当大的损失。 最近几年,缓冲区溢出现象仍然层出不穷。m i c r o s o f t 在2 0 0 9 年公布的 1 9 0 个漏洞【3 】之中,由缓冲区溢出攻击直接或间接引起的漏洞就多达6 4 个。 在2 0 0 8 年9 月份g o o g l e 发布的c h r o m e 浏览器的首个公开测试版中就存在 一个非常严重的缓冲区溢出问题【4 】。该浏览器在拷贝位图时会发生缓冲区溢 出,原因是它的指示器在指向不同区域之间相互拷贝时候并没有对字节和大 小予以检测。它允许未经检测的代码( 如攻击代码) 存放在受保护的内存区 域之中,并在没有相关权限的情况下执行它。一旦黑客发现这个漏洞就很容 易的加以利用,造成一系列的损失。 绿盟科技n s f o c u s 安全小组2 0 0 7 年0 9 月之十大安全漏洞【5 】中,与缓 冲区溢出相关就有6 个,超过了百分之五十。分别是: ( 1 ) m s nm e s s e n g e r 视频对话堆溢出漏洞 ( 2 ) a c f i v e x 控件畸形u r l 栈溢出漏洞 ( 3 ) m i c r o s o rs q ls e r v e rs q l d m o m la c f i v e x 控件缓冲区溢出漏洞 ( 4 ) m i c r o s o f tv i s u a lb a s i c6 0v b po p e n 函数缓冲区溢出漏洞 ( 5 ) 暴风影音m p s d l la c d v e x 控件多个远程溢出漏洞 ( 6 ) 联众世界游戏大厅g l i t e m n a t d l la c t i v e x 控件堆溢出漏洞 ( 7 ) i b ma i x 多个本地溢出和拒绝服务漏洞 到了2 0 0 8 年,情况稍微好转,十大安全漏洞中也有3 个是缓冲区溢出攻 击漏洞1 6 j ,分别如下: ( 1 ) m i c r o s o rw o r dr t f 畸形字符串处理堆溢出漏洞,远程攻击者可能 利用该漏洞以浏览者身份执行任意指令。 ( 2 ) r e dh m 目录服务器l d a p 查询缓冲区溢出漏洞。 ( 3 ) n e t s n m pp e r l 模块缓冲区溢出漏洞。 我国在网络安全漏洞的发现和研究方面仍存在较大差距,我国至今还没 有建立起系统化的安全漏洞发现与分析能力。因此,寻找有效的方法去检测 并消除缓冲区溢出具有很强的现实意义。 2 哈尔滨工程大学硕士学位论文 1 2 研究现状 有关缓冲区溢出漏洞研究,国内外一些大学和研究机构的研究人员作了 大量研究并已经取得了一定的进展。其中,从编译的角度出发进行检测的方 法主要分为静态检测和动态检测。静态检测【7 】是指在程序的编译阶段针对源 码中的漏洞进行检测,这里指的程序未必是源程序,也可以经过之前的编译 过程生成的中间程序。动态检测是指在程序的运行阶段为发掘程序中的漏洞 而进行的检测,这里的程序一般指的是源程序。本文将着重介绍从这两个方 面去介绍相应的方法。 1 2 1 静态检测技术 静态检测是近几年研究的一个主要趋势,内容大体分成几类: ( 1 ) 针对源程序进行检测 该方法通过对源代码的词法分析和扫描,对缓冲区溢出发生的模式进行 识别,从而完成溢出漏洞的检测。这类检测技术的特点是实现简单,算法效 率高,但由于没有考虑到语法和语义层次的信息,容易出现漏报和错报。它 是国内外研究较多的一个分支。 ( 2 ) 针对编译生成的中间结构 以g c c 为例,可以针对c k 2 c 编译源码生成的语法树或者r t l 结构进行 研究。通过提取出需要的诸多属性,在规划好的原则下对可能存在的漏洞予 以检测。这个方向是本文重点研究的方向。 ( 3 ) 针对编译生成的可执行文件 这类研究比较少见,一种典型的研究是通过一些反汇编工具对目标代码 进行处理,然后再依赖一些源代码静态检测技术进行处理。另外也有一些黑 箱测试如f u z z 的检测工具,但是它依赖于类似于强力破解的技术,尚处于研 究的初步阶段。 关于静态检测有四个有代表性的工具,分别为l i n t ,i t s 4 ,f l a w f i n d e r , r a t s 。 l i n t 8 】是针对c 肥+ + 的开源安全检测工具。它可以针对程序中的语义, 3 哈尔滨工程大学硕士学位论文 对可能的空指针、野指针等进行检测。它有一部分检测功能是和传统编译器 重叠的,只是分析的程度更加深入。此外,它可以在工程中检测文件里的错 误,因此在早期的静态检测里占据主要的地位。而后,又有开发者根据l i n t 开发了l c l i n t n 和s p l i n t 1 0 l 两种工具。这两种工具在一定程度上增强了检测的 准确性。 i t s 4 t 1 1 j 是一款用来检测c 语言中是否含有漏洞的工具,它是脱离编译器 的第三方工具。和其它的方法相比,i t s 4 更加注重的是准确率和效率的平衡。 这种方法注重效率体现在它能给开发者最实时的反馈。准确性是相对而言的, 一方面它可以检索工程中的每个路径下面的文件,找出可能存在漏洞的地方。 另一方面,它扫描的内容比较简单。例如,它只是进行了简单的字符串匹配, 对诸如s t r c p y 类的函数,只要第二个参数不是常量字符串,它就给出警告。 从这一点来看,显然是不准确的。 与i t s 4 相比,f l a w f m d e r p l 可以准确一些。对诸如s t r c p y 类的函数,它 可以对源操作数的字符串类型进行区分,从而针对常量字符串和变量字符串 做进一步的检测。它是由p y t h o n 编写的,也是针对c 、c + + 语言的。 r a t s t l 2 】是一款检测能力比较粗糙的工具。它可以扫描c 、c + + 、p y t h o n 等多种语言内部含有的诸如缓冲区溢出之类的安全错误。检测完毕后它会给 出相应的检测时间。它后台的数据库有相应的关注的漏洞信息和对漏洞的描 述以及相应的修改建议。另外,它还具有一定的可配置性,可以对后台的漏 洞信息进行选择和配置。r a t s 仍然可能会有误差,因此,开发者也建议, l 认t s 报告的建议只是给编程者提供一定的参考。 在诸多研究机构的研究方法中,有两个可以借鉴一下,分别如下: ( 1 ) 余建军等提出的基于整数区间【l3 】和控制依赖图的方案 它引入了整数区间的概念,把对数组、指针的判断问题转换成了整数区 间的比较问题。它提出了在语法树一级上通过静态分析来检测c 语言源程序 中是否存在安全隐患。这些安全隐患包括缓冲区溢出、空指针引用等等。该 方法还以讨论了诸如变量定义、表达式、选择结构、循环结构等结构的实现 算法。 ( 2 ) 刘应华、姜建国等提出的缓冲区溢出的建模分析方法【1 4 】 该方法是对c 语言的源代码做静态分析,把缓冲区溢出这个事件作为一 4 哈尔滨工程大学硕士学位论文 个整数区域问题来看待,从而建立缓冲区溢出的数学模型。它通过静态分析 的方法来发现潜在的缓冲区溢出漏洞。 这两种方法将是本文重点借鉴的地方,在第四章会有重点的介绍。 1 2 2 动态检测技术 由于本文的研究立足点是编译器,所以将着重介绍从编译器角度去进行 动态检测,同时对另外两种动态检测的技术以简要介绍。动态检测方法主要 可以分为单栈结构检测方法和双栈结构检测方法。 1 单栈结构方面 单栈结构只是针对栈攻击引入的, 然是在传统单栈结构下进行动态检测。 又能在一定程度上保证安全性。 它指的是不改变当前的体系结构,仍 它的好处是既可以兼容现有的程序, ( 1 ) s t a c k g u a r d 和w i n d o w s 的g s 选项 s t a c k c m a r d 1 5 】和w i n d o w s 的g s t 6 】选项是在单栈结构的体系架构下防止 栈溢出的两款工具。它们也是动态检测工具当中做的比较好的两款,它提出 的思路为后续的解决方案提供了很好的铺垫。它们都是通过保护返回地址来 保护栈。为了方便说明,首先介绍基本的栈帧结构如图: 高地址,栈底 川 函数参数 返回地址 前一栈帧e b p 局部变量 低地址,栈顶 图1 2 标准栈帧结构 由上图可知,传统的栈结构由高地址到低地址依次是函数参数,返回地 址,e b p ,局部变量。由于字符串生长方向与栈的生长方向相反,局部变量向 5 哈尔滨工程大学硕士学位论文 上溢出从而可以覆盖返回地址。 s t a c k g u a r d 和w i n d o w s 的g s 选项的原理都是在原有堆栈的结构上加入 一个标志位,在函数结束时候对这个标志位进行判断。如果标志位发生了变 化,则认为受到了缓冲区溢出攻击。不过二者插入标志位的位置有所不同, s t a c k g u a r d 插入标志位的位置在返回地址和e b p 之间,而w i n d o w s 的g s 选 项插入标志位的位置在c b p 和局部变量之间。如下图: 高地址,栈底 函数参数 返回地址 标志位 前一栈帧e b p 局部变量 低地址,栈顶 s t a e l g u a r d 高地址,栈底 函数参数 返回地址 前一栈帧e b p 标志位 局部变量 低地址,栈顶 m i c r o s o f t 的,g s 选项、p r o p o l i c e 图1 3 栈帧对比 这两种方法的前提是假设缓冲区溢出攻击的覆盖操作是连续的,这样, 才会先覆盖标志位,再覆盖返回地址。如果不是连续的,可以越过标志位, 直接覆盖返回地址。 w i n d o w s 的g s 选项是s t a c k g u a r d 动态检测的一个扩展。基于 s t a c k g u a r d ,它有两点创新: 1 ) 它插入标志位的位置是在c b p 和局部变量之间。 2 ) 插入的标志位数值,它是经过了随机数和指定栈寄存器的数据的异或 操作。具体结构如下图: 6 哈尔滨工程大学硕士学位论文 图1 4 标志位的选取 标志位一旦被攻击者获取,攻击者可以选择用标志位对应的字符数值去 覆盖返回地址。这样的攻击不改变标志位的数值,却可以躲开检测的方法。 经过上面的处理之后,标志位就变得不容易被获取,这样安全性就提高了。 ( 2 ) p r o p o l i c e p r o p o l i c e 1 7 j 是对s t a c k g u a r d 的又一次改进。它继承了的s t a c k g u a r d 方法, 而插入标志位的位置借鉴了w i n d o w s 的g s 选项,是介于e b p 和局部变量之 间。除此之外,它还做了以下几个工作: 1 ) 扫描代码中哪些函数里面可能存在缓冲区溢出 对于可能存在缓冲区溢出的函数采用函数入栈插入标志位、退栈检测标 志位的方法。而对于不存在缓冲区溢出可能的函数则不进行此操作。这样可 以最大程度上减少不必要的运行开销。例如,在栈里并不存在字符数组,字 符指针甚至函数指针,那这个函数发生缓冲区溢出攻击的概率是很低的。它 可以用很小的安全代价换来运行效率的大幅度提高。 2 ) 重新分配栈内的局部变量的顺序 从栈顶到栈底的方向,依次为包含字符数组的局部变量,不包含字符数 组的局部变量。这样,字符串从低地址向高地址方向覆盖时候,无法覆盖到 当前函数的其它不包含字符数组的局部变量,其中就包括了函数指针。而向 上覆盖的时候当到达标志位的时候就发生了覆盖,会在函数调用结束的时候 7 哈尔滨工程大学硕士学位论文 被发现。因此它的安全性比传统的s t a c k g u a r d 方法要高。 3 ) 对参数中存在函数指针的进行特别的处理 如果参数中存在函数指针,在局部变量里面加入一个函数指针,并且把 参数的函数指针拷贝到当地的这个新声明的函数指针。对函数内部有使用参 数的这个函数指针的地方进行替换,替换成新生成的这个函数指针局部变量。 经过以上的几个步骤,p r o p o l i e e 保证了一定的效率,即增长百分之二十 左右的代码量。它对函数的保护能力相比之前的s t a c k g u a r d 要好很多,它不 但可以保护栈内部的函数的返回地址,也可以保护堆栈内的部分局部变量。 因此,它是对s t a c k g u a r d 成功的一次改进。但是,由于它的核心思想还是源 自于s t a c k g u a r d ,所以它仍然可以被某些攻击略过,它仍然不是完美的方法。 2 双栈结构方面 在某种意义上,单栈结构是栈攻击如此频繁的一个原因。传统栈结构把 返回地址,e b p 这样的控制信息和函数参数、局部变量放在一个栈里。这样, 局部变量和参数就有机会覆盖返回地址。 双栈结构是指在传统的栈结构之外又申请了一个栈空间用来存放传统栈 中部分内容的结构。它可能作为传统栈结构数据中某一项或某几项数据的备 份,也可能把传统栈结构中的数据分离出来放在新栈里面,从而在一定程度 上提高安全性。为了便于说明问题,只要是涉及双栈的内容本文都放在这里 进行整理。例如,下面的分离局部变量的方法实际上涉及的是体系结构方面 的改变,而不是传统意义上动态检测,只是为了便于说明而统一放在动态检 测这一节中。 ( 1 ) s t a c k s h i e l d s t a c k s h i l e d 墉l 是双栈结构使用上的一个先例,它在传统的栈结构之外, 又生成了一个栈结构,这个栈结构用来备份传统栈结构中的返回地址。它的 结构如下图所示: 8 哈尔滨工程大学硕士学位论文 高地址,栈底 备份的返回地址 h 低地址,栈顶 高地址,栈底 函数参数 返回地址 前一栈帧e b p 局部变量 低地址,栈顶 新建的栈结构传统栈结构 图1 5s t a c k s h i e l d 与传统栈结构对比 如果传统栈结构内部发生了缓冲区溢出攻击而导致返回地址被覆盖了, 备份的返回地址仍然可以覆盖回传统的栈内从而保证系统的流程正确。它实 现的方法类似于s t a c k g u a r d 类方法,它在进入函数和退出函数时分别进行处 理。进入函数的时候它拷贝返回地址到另外的一个栈中,退出函数前将另外 一个栈的返回地址恢复到当前的栈内,这样可以保证函数的流程不发生改变。 经过这样的处理后,无论是否发生了缓冲区溢出攻击,函数的执行都不受影 响。但事实上,由于它并没有把e b p 也进行备份,它还是有缺陷的。因此, 在e b p 被覆盖的情况,缓冲区溢出仍然可以发生。 s t a c k s h i e l d 对于解决缓冲区溢出有很强的指导意义,它提出的双栈思想 为后续的动态检测方法提供了很好的思路。它是开源的软件,可以参照对应 的代码实现新的想法。 ( 2 ) 分离返回地址的双栈结构 s t a c k s h i e l d 提供的是一个备份功能的双栈结构,而k a l b a r e z y k 等据此提 出的分离返回地址【坶】到另外一个栈的方法。由于返回地址是主要的控制信 息,因此可以对两个栈进行重新命名。把主要存放参数的和局部变量的栈结 构叫数据栈,而把存放返回地址的栈结构叫控制栈。具体堆栈结构如下图: 9 哈尔滨工程大学硕士学位论文 高地址,栈底 川 返回地址 川洲 低地址,栈顶 高地址,栈底 函数参数 前一栈帧e b p 局部变量 低地址栈顶 控制栈数据栈 图1 6 返回地址单独存储的双栈结构 它不同于s t a c k s h i l e d 的地方在于它完全把返回地址存放于控制栈之内, 不过这种想法有几个弊端如下: 1 ) 同s t a c k s h i e l d 一样,它仍然不能保护e b p ,所以它仍然是有安全隐患 的。其实也是可以做一些改进的,例如可以在函数调用之前把e b p 备份一个 放在新栈里,在函数返回的时候把e b p 复位,这样即使发生了缓冲区溢出而 导致e b p 被覆盖,新的复位以后,e b p 仍然保持不变。 2 ) 它的兼容性很差。它把参数和返回地址分开了,从汇编语言上讲,一 个c a l l 指令的作用就是把参数和返回地址同时压入栈,而一个r e t 指令则是把 参数和返回地址同处弹出栈。因此如果把返回地址完全分离出来,需要修改 c a l l 和r e t 指令,从而导致与现有的程序无法兼容。 ( 3 ) 分离全部数据域的双栈结构【2 0 j 同s t a c k s h i e l d 所不同的是,k a l b a r c z y k 的方法针对双栈体系结构的改变, 它并没有实现动态检测。简而言之,s t a c k s h i e l d 实现的是返回地址的备份, 而k a l b a r c z y k 的方法实现的是对返回地址的分离。其实,在这个基础上,可 以有另外一种等价效果,那就是把可能覆盖返回地址的数据全部分离出来, 即分离栈内函数的参数和局部变量到另外的一个栈结构当中。它的结构如下 图: 1 0 哈尔滨工程大学硕士学位论文 高地址,栈底 函数参数 局部变量 低地址,栈项 数据栈 高地址,栈底 返回地址 前一局部变量指针 川 低地址,栈顶 控制栈 图1 7 分离全部数据域的双栈结构 采用这种结构后,控制栈内每个函数对应的栈内空间是常量,而长度可 以变化的函数参数和局部变量都已经转移到数据栈结构当中去了。因此,传 统栈中的e b p 就没有意义了。而对局部变量和调用参数的访问都可以通过本 函数的数据栈帧指针加上偏移量进行引用。同( 2 ) 所介绍的那样,它同样分 开了参数和返回地址,因此无法对现有的程序进行兼容。 ( 4 ) 分离部分数据的双栈结构1 2 0 j 上面提到的( 2 ) 、( 3 ) 方法都是很好的思路,但是它们都无法兼容现 有的程序。当前的很多软件已经处于使用当中,因而兼容性应该作为重要的 一个参考对象。为了兼容原有的程序,需要做到参数和返回地址始终处于传 统的栈结构当中。缓冲区溢出的绝大多数均来自局部变量,基于这一点,有 了部分分离数据域的双栈结构,结构如下: 哈尔滨工程大学硕士学位论文 高地址栈底 局部变量 低地址,栈顶 高地址,栈底 函数参数 返回地址 前一局部变量指针 川 低地址,栈顶 数据栈控制栈 图1 8 分离部分数据的双栈结构 它在传统的栈结构之外新生成了一个栈结构,局部变量的分配全部放在 新生成的栈里面。而传统的栈内也加入了一个前一局部变量块指针,它的作 用类似于e b p ,用于准确定位新生成的局部变量内部对应函数的局部变量的 位置。它将是本文的实现动态检测的一个出发点,在本文第四章里面会有详 细的介绍。 1 2 3 其它方法 除了以上的从编译器角度去解决缓冲区溢出的方法以外,还有两种方案 在一定程度上实现了对缓冲区溢出的解决,分别介绍如下: 1 l i b s a f e l i b s a f e e 2 l 】是l i n u x 操作系统下的一款动态检测工具。它是由非常著名的 b e l l 实验室开发的。它主要用来检测堆栈溢出和格式化字符串的攻击。这款 工具主要由一些实现开发好的c 语言库函数组成。 在c 语言中,标准库中有一些字符串处理库函数( 例如s t r c p y ,s p r i n f f ) 是不安全的。例如字符串拷贝函数,它把源字符串拷贝到目的字符串的操作 仅仅是把源字符串中o 之前的字符串拷贝到目的字符串中。显然,这个标准 是不够的,很多攻击就是利用这些函数来进行攻击的。l i b s a f e 重新提供了这 些不安全的库函数,在实现这些库函数原有功能的同时,它可以确保溢出仅 仅发生在堆栈帧之内。也就是说,它只能保护返回地址,而不能保护e b p 。 1 2 哈尔滨工程大学硕士学位论文 e b p 作为控制堆栈的控制信息,如果它被覆盖仍然是不安全的。在系统中, l i b s a f e 是通过动态链接库来实现保护功能的。目前,在l i n u x 系统当中,动 态链接库在程序中得到了大量的推广和实用。它有升级方便等许多优点。除 此之外,l i n u x 系统还对动态链接库提供了预载机制。l i b s a f c 就是基于这样的 一个机制来实现的。例如,一个系统中对于一个库函数有多种动态链接库可 以实现,当函数调用的时候,系统将优先选择环境变量l dp r o l o a d 所指 定的动态链接库。这样可以使不安全的函数库被安全的库函数替换掉。 该方法也是有弊端的,它所提供保护的库函数仅仅保护了缓冲区溢出的 一个小的子集,就连它所保护的格式化字符串攻击也是只能防护一部分。并 且,如果程序员在编译程序的时候使用了一些选项如f o m i t f r a m e - p o i n t e r 等 等,会把l i b s a f c 需要读取的一些信息破坏。这样就影响l i b s a f e 的防护。同时, 如果用户取消或者重置了l dp r e l o a d 等环境变量的话,也可以影响l i b s a f e 的防护。同时,l i b s a f e 解决缓冲区溢出的方法都是针对已出现的攻击来修补 程序的缺陷,也就是说,它所保护的程序可能在未来受到攻击。 2 不可执行堆栈 缓冲区溢出发生的前提是缓冲区是可以执行的,如果将进程内的缓冲区 设置为不可执行,则可以使利用把恶意代码放入数据地址空间的攻击得到抑 制。一些系统为了能够提高执行效率,却在缓冲区内放置了可执行的代码。 如果设置缓冲区为不可执行,兼容性就成了最大的问题。因此,主要研究的 是不可执行堆栈瞄】的问题。 该方法是通过给内核打补丁来实现的。u n i x ,l i n u x ,w i n d o w s 和s o l a r i s 等操作系统都提供了这方面的内核补丁。它所产生的兼容性问题很小。不过 在l i n u x 中,存在着以下两个特例: ( 1 ) 信号传递 l i n u x 为了给进程发送u n i x 信号而对进程添加了一些代码。这些代码通 过引发中断来执行堆栈中的代码。这时候,需要设置缓冲区是可以执行的。 ( 2 ) g c c 的在线重用 g c c 在堆栈放置了可执行代码以便在线重用。可以选择关闭这个功能, 它的代价是部分功能不能使用。 可以通过系统软件来启动完成堆栈不可执行的代码,当然会有一些性能 哈尔滨工程大学硕士学位论文 方面的损失。为了弥补性能方面的损失,现在的一些c p u 也开始提供硬件支 持,性能方面可以忽略。 由此,不难看出其缺点,对于不需要执行堆栈中的代码的攻击,本方法 就不能避免了。因此它不能完全保护堆栈,并且存在一定的兼容问题,另外, 如果要实现这个功能,需要重新编译内核。 i 3 本文的工作 本文从五个方面来论述缓冲区溢出的原理、攻防发展以及针对缓冲区溢 出提出的解决方案。 第l 章着重介绍缓冲区溢出的研究内容和研究现状。着重介绍了针对缓 冲区溢出攻击而产生的各种防御技术,本文从编译角度对这些方法的利弊进 行了分析。 第2 章着重介绍了缓冲区溢出的定义、原因和原理。 第3 章介绍了g c c 的相关背景知识,这些内容是完成后面实验所需要的 基本知识储备。这些储备包括了语法树、r t l 结构、g c c 框架和编译流程等 等。 第4 章针对之前检测方法的不足,提出了本文方法的设计思路。同时本 文从理论方面对本文提出的方法予以了验证并分析了相关利弊。 第5 章针对第3 章所提供的知识储备对本文提出的方法予以了实现。 最后,对本论文进行了总结,指出了本课题今后进一步的研究方向。 1 4 哈尔滨工程大学硕士学位论文 2 1 溢出的原理 第2 章缓冲区溢出原理 提到缓冲区溢出,就不得不先提缓冲区。缓冲区是程序运行时操作系统 在内存区域开辟出来一部分区域,它包括堆栈,数据区,文本区。堆栈区一 般指堆和栈。数据区一般指b s s 段,包括了全局变量和未初始化的静态变量。 文本区包括的都是只读数据,一般指机器码。一般来说,缓冲区一旦被分配, 它的大小就被确定了。缓冲区溢出田】是一种危害很大的系统攻击手段,它向 有限的缓冲区区域输入超过其长度的信息而造成别的缓冲区部分内容的覆 盖,最终达到使程序的流程发生转变,去执行相关攻击代码的过程。 缓冲区溢出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论