Fuzzing测试通常以大小相关的部分、字符串、标志字符串开始或结束的二进制块等为重点,使用边界值附近的值对目标进行测试。Fuzzing技术根据应用对象主要可分为三类,一类是文件格式的Fuzzing,主要针对图像格式、文档格式等,一类是协议的Fuzzing,主要针对RPC协议和HTTP协议等,另一类是用于API测试[4]。
2.2 漏洞分析和利用原理
漏洞分析是指在代码中迅速定位漏洞,弄清攻击原理,准确的估计潜在的漏洞利用方式和风险等级的过程。
图2.1 fuzzing通用测试过程
2.2.1 栈溢出
系统栈的功能是用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行[5]。一个典型的函数调用栈如图2.2。
图2.2 栈帧结构
栈溢出是一种比较好利用的缓冲区溢出漏洞。 栈溢出的原理就是利用缓冲区溢出(超过了缓冲区的上边界),即往栈生长方向的相反方向生长,那么就有可能覆盖一些关键指针,比如前栈帧指针或者函数返回地址等。此时,程序的运行就会发生异常,比如返回地址的修改将使程序运行跳转到不可预料的地址(如跳转到恶意程序等)[6]。
2.2.2 shellcode
人们用shellcode这个专用术语来通称缓冲区溢出攻击中植入的代码[7]。这段代码可以是出于恶作剧目的的弹出一个消息框,也可以是出于攻击目的的删改重要文件、窃取数据、上传木马病毒并运行,甚至是出于破坏目的的格式化硬盘等。shellcode往往需要用汇编语言编写,并转换成二进制机器码。其内容和长度经常还会受到很多苛刻的限制,故开发和调试的难度很高。
2.2.3 Heap Spraying
传统缓冲区溢出漏洞利用时要求覆盖的返回地址数值是可控的,当这个数值不可控时,该漏洞将无法利用。但在ActiveX控件漏洞利用中,可以没有这个限制,即使覆盖的返回地址是不可控的,如果该数值位于堆内存范围,通过控制堆内存的数据,依旧可以利用该漏洞。
这是通过JavaScript语句申请并填充堆内存空间达到的,所以ActiveX控件漏洞利用技术更加灵活[8]。现在最流行的堆exploit技术是SkyLined为了利用Internet Explorer IFRAME漏洞而开发的堆喷射(heap spraying,本文中采用堆喷射的译法)技术。
图2.3 Heap Spraying前后堆内存变化
Heap Spraying的过程如下:用JavaScript脚本创建了很多个string对象,在string对象中写入一个长长的NOP链以及紧接着NOP链的一小段shellcode。JavaScript runtime会把这些string对象都存储在堆中。在Heap Spraying前后堆内存分布如图2.3所示,由于堆中的数据是不断向内存高地址增长的。在大约分配了200MB的内存给这些string对象之后,在50MB~200MB这段内存中,所用的内存空间都被NOP+shellcode覆盖,如图3所示,Heap Spraying前Call 0x3c0dff7d指令提示Invalid Memory,但Heap Spraying后,0x3c0dff7d指令已经指向NOP链中的一环。执行了Call 0x3c0dff7d后,就能跳到这个NOP链上,最终执行Shellcode[9]。
2.3 本章小结
本章首先介绍了漏洞挖掘原理,然后介绍了漏洞的分析和利用原理,重点说明了栈溢出、shellcode、heap spraying。
3 ActiveX控件漏洞
简述了ActiveX控件及其安全性;介绍了ActiveX控件漏洞挖掘和分析的工具 。
3.1 ActiveX控件及其安全性
ActiveX是微软公司在1996年引进的,它是在组件对象模型(COM)、对象链接和嵌入(OLE)技术的基础上发展而来[10]。COM规范是ActiveX技术的基础,而COM的目的是创建对象和提供接口来实现代码片段的简单复用,而这些接口又能被其他的COM对象或者程序调用,ActiveX就是这项规范与IE的结合。这种结合提供了IE浏览器与第三方软件的接口,使用ActiveX控件可以对IE浏览器进行功能扩展。通过安装相应的ActiveX控件,可以实现在网页上播放Flash动画,在网页上嵌入Excel表格,在网页上提供打印功能,为网络银行的登陆用户名和密码提供安全保护功能等等多种应用。ActiveX控件使IE能够实现许多桌面软件才有的功能。 ActiveX漏洞挖掘技术研究+文献综述(3):http://www.751com.cn/jisuanji/lunwen_6136.html