欢迎来到天天文库
浏览记录
ID:37432670
大小:298.60 KB
页数:38页
时间:2019-05-12
《缓冲区溢出漏洞发掘模型》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、缓冲区溢出漏洞发掘模型作者:funnywei日期:2003.12内容摘要简介(Introduction)相关工作(RelatedWork)我们的模型(OurModel)总结(Conclusion)Copyright©funnywei2003简介研究的必要性C和C++语言仍然是开发的主要工具缓冲区溢出攻击已成为主要攻击手段Copyright©funnywei2003相关工作(RelatedWork)静态检测(StaticDetection)动态检测(DynamicDetection)主要分为动态和静态检测两种方法,其中静态检测工具主要针对源码做相应检测,而动态检测工具主要从对二进制程序运行时保
2、护的角度出发。Copyright©funnywei2003静态检测工具第一代:lint第二代:Splint和LClint第三代:Flowfinder,RATS,ITS4Copyright©funnywei2003动态检测工具FIST(FaultInjectionSecurityTool)Libsafe和LibverifyStackShieldCopyright©funnywei2003我们的检测模型静态分析动态分析和测试Copyright©funnywei2003静态分析目的:得到子过程调用的关系图,以便后续的分析。每一个子过程作为图中的一个节点,同时不安全的函数也作为一个节点存在。方法:c
3、all和ret指令搜索编译器优化和特征码匹配缓冲区边界的定位辅助:基于污点传播的双向数据流分析Copyright©funnywei2003有向图举例:fun(char*arg){charsrc[100]={“Thisisatest”};strcpy(arg,src);printf(“%s”,arg);}main(){chardest[100];fun(dest);printf(“%s”,dest);}Copyright©funnywei2003有向图节点记录子函数的起始位置函数所分配的堆栈大小函数局部变量的使用情况调用者传递给函数的参数调用者调用本函数的地址(即函数调用的返回地址)C
4、opyright©funnywei2003call和ret指令搜索采用深度优先或者广度优先的搜索算法。Copyright©funnywei2003编译器优化和特征码匹配编译器对程序进行了优化以提高执行速度,有些函数(如strcpy,strcat)被硬编码到程序中。如:strcpy()main(){chardest[100];charsrc[100];gets(src);strcpy(dest,src);return;}Copyright©funnywei2003VC6.0编译器思想:只要在程序中以ECX为核心对指令进行匹配,同时配合这三条字符串操作指令,就可以定位strcat和strcpy。
5、repnescasbyteptr[edi];扫描源字符串,长度存放在ecx中notecx.....movEnX,ECX.....shrecx,2repmovsdwordptr[edi],dwordptr[esi]movecx,Enxandecx,3.....repmovsbyteptr[edi],byteptr[esi]Copyright©funnywei2003VC7.0编译器strcpy函数也会被硬编码到程序中去,但是它产生的二进制码却和VC6.0产生的二进制码有很大的区别。strcpy硬编码如下:00401041movcl,byteptr[esp+eax]00401045movbyte
6、ptr[esp+eax+14h],cl00401049inceax0040104Atestcl,cl0040104Cjne00401041因为在这些硬编码的代码中使用了相对基址变址寻址方式,所以在VC7.0下简单提取strcpy的固定二进制特征码比较难,但是我们可以结合指令的语义进行分析,来构建strcpy函数的特征码。Copyright©funnywei2003缓冲区边界的定位Libsafe对缓冲区估算采用最大化到栈帧的方法。本文思想:根据指令对内存单元访问情况来界定缓冲区边界。方法:(1)通过分析未直接访问的堆栈单元来确定目标缓冲区长度(2)根据局部变量的访问方式来确定目标缓冲区的长度(
7、3)通过其他方法判断缓冲区长度Copyright©funnywei2003通过分析未直接访问的堆栈单元来确定目标缓冲区长度对于普通的变量,如果没有在程序中被使用,那么程序将不会为其在堆栈中保留地址空间。但是对于数组字符数组来说,只要数组中有一个成员被访问,程序就会在堆栈中为整个数组保留地址空间。然而在编译后的程序中没有任何一条指令对其余的地址空间进行访问。intmain(intargc,char*argv[]
此文档下载收益归作者所有