缓冲区溢出漏洞发掘模型.ppt

上传人:wuy****n92 文档编号:66696817 上传时间:2022-12-19 格式:PPT 页数:38 大小:265KB
返回 下载 相关 举报
缓冲区溢出漏洞发掘模型.ppt_第1页
第1页 / 共38页
缓冲区溢出漏洞发掘模型.ppt_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《缓冲区溢出漏洞发掘模型.ppt》由会员分享,可在线阅读,更多相关《缓冲区溢出漏洞发掘模型.ppt(38页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、缓冲区溢出漏洞发掘模型缓冲区溢出漏洞发掘模型作者:funnywei日期:2003.12内容摘要简介(Introduction)相关工作(Related Work)我们的模型(Our Model)总结(Conclusion)Copyrightfunnywei2003简介研究的必要性C和C+语言仍然是开发的主要工具缓冲区溢出攻击已成为主要攻击手段Copyrightfunnywei2003相关工作(Related Work)静态检测(Static Detection)动态检测(Dynamic Detection)主要分为动态和静态检测两种方法,其中静态检测工具主要针对源码做相应检测,而动态检测工具主

2、要从对二进制程序运行时保护的角度出发。Copyrightfunnywei2003静态检测工具第一代:lint第二代:Splint和LClint第三代:Flowfinder,RATS,ITS4Copyrightfunnywei2003动态检测工具FIST(Fault Injection Security Tool)Libsafe和LibverifyStack ShieldCopyrightfunnywei2003我们的检测模型静态分析动态分析和测试Copyrightfunnywei2003静态分析目的:得到子过程调用的关系图,以便后续的分析。每一个子过程作为图中的一个节点,同时不安全的函数也作为

3、一个节点存在。方法:call和ret指令搜索 编译器优化和特征码匹配缓冲区边界的定位辅助:基于污点传播的双向数据流分析 Copyrightfunnywei2003有向图举例:有向图举例:fun(char*arg)charsrc100=“Thisisatest”;strcpy(arg,src);printf(“%sn”,arg);main()chardest100;fun(dest);printf(“%sn”,dest);Copyrightfunnywei2003有向图节点记录有向图节点记录子函数的起始位置函数所分配的堆栈大小函数局部变量的使用情况调用者传递给函数的参数调用者调用本函数的地址(即

4、函数调用的返回地址)Copyrightfunnywei2003call和ret指令搜索 采用深度优先或者广度优先的搜索算法。Copyrightfunnywei2003编译器优化和特征码匹配编译器优化和特征码匹配编译器对程序进行了优化以提高执行速度,有些函数(如strcpy,strcat)被硬编码到程序中。如:strcpy()main()char dest100;char src100;gets(src);strcpy(dest,src);return;Copyrightfunnywei2003VC 6.0编译器编译器思想:只要在程序中以思想:只要在程序中以ECX为核心对指令进行匹配,同时为核心

5、对指令进行匹配,同时配合这三条字符串操作指令,就可以定位配合这三条字符串操作指令,就可以定位strcat和和strcpy。repnescasbyteptredi;扫描源字符串,长度存放在ecx中notecx.movEnX,ECX.shrecx,2repmovsdwordptredi,dwordptresimov ecx,Enxandecx,3.repmovsbyteptredi,byteptresiCopyrightfunnywei2003VC 7.0编译器编译器strcpy函数也会被硬编码到程序中去,但是它产生的二进制码却和VC6.0产生的二进制码有很大的区别。strcpy硬编码如下:004

6、01041movcl,byteptresp+eax00401045movbyteptresp+eax+14h,cl00401049inceax0040104Atestcl,cl0040104Cjne00401041因为在这些硬编码的代码中使用了相对基址变址寻址方式,所以在VC7.0下简单提取strcpy的固定二进制特征码比较难,但是我们可以结合指令的语义进行分析,来构建strcpy函数的特征码。Copyrightfunnywei2003缓冲区边界的定位缓冲区边界的定位Libsafe对缓冲区估算采用最大化到栈帧的方法。本文思想:根据指令对内存单元访问情况来界定缓冲区边界。方法:(1)通过分析未直

7、接访问的堆栈单元来确定目标缓冲区长度(2)根据局部变量的访问方式来确定目标缓冲区的长度(3)通过其他方法判断缓冲区长度 Copyrightfunnywei2003通过分析未直接访问的堆栈单元来确定目标缓冲区长度通过分析未直接访问的堆栈单元来确定目标缓冲区长度对于普通的变量,如果没有在程序中被使用,那么程序将不会为其在堆栈中保留地址空间。但是对于数组字符数组来说,只要数组中有一个成员被访问,程序就会在堆栈中为整个数组保留地址空间。然而在编译后的程序中没有任何一条指令对其余的地址空间进行访问。intmain(intargc,char*argv)chardest100=“thisisme”;prin

8、tf(%s,dest);strcpy(dest,thisisatest);return0;Copyrightfunnywei2003首先,subesp,64h在堆栈中保留0 x64个字节的空间。其次,根据特征码匹配和非安全函数调用匹配找到字符缓冲区的起始位置:0040101E56pushesi0040101F57pushedi.0040105D8D542408leaedx,esp+8.004010658BFAmovedi,edx.0040106AF3A5repmovsdwordptredi,dwordptresi由此,我们可以认为字符缓冲区的起始位置为esp+8。由于有压栈的操作,ESP的值不

9、固定,我们用base来代表程序开始时subesp,64h所指向的位置。esp+8所指向的位置其实就是base。Copyrightfunnywei2003然后可以分析以ESP,EBP为基址寄存器的指令:0040101589442400movdwordptresp,eax0040101E56pushesi0040101F57pushedi00401020894C240Cmovdwordptresp+0Ch,ecx0040102488442412movbyteptresp+12h,al004010336689542410movwordptresp+10h,dx由上可以看出在程序保留的变量中,有很大一

10、部分都没有被指令所访问,只是通过repstosdwordptredi将其设为0,而通过前面的分析已经知道对于普通变量来说,如果没有被指令直接访问就不会为其在堆栈中保留地址空间,所以,我们就可以认为,这些地址空间都在字符数组中。Copyrightfunnywei2003根据局部变量的访问方式来确定目标缓冲区的长度根据局部变量的访问方式来确定目标缓冲区的长度main()chardest36=“thisisatest”;inta=1;printf(“%s,%d”,dest,&a);对于普通变量来说,如果只是作为目的操作数而从来没有作为源操作数使用,那么它将肯定被编译器优化掉。但是对于数组来说,即使其

11、某个成员从头到尾都作为目的操作数而存在,它也不会被编译器优化掉。通过这个特性,我们就可以确定缓冲区的边界。Copyrightfunnywei2003在这个程序的汇编代码中没有出现repstos指令,字符数组的初始化都是通过mov指令来完成的,所以,我们不能通过查找没有直接使用的地址来判断缓冲区的长度。在这个程序中,只有两条指令用堆栈中的变量作为源操作数,0040103B8D542400leaedx,esp;取变量a地址.004010438D442404leaeax,esp+4;取字符串首址对于堆栈中其他的地址空间来说,它们都没有被用作源操作数,所以根据我们对编译器优化局部变量原则的分析,我们可

12、以认为这些地址所指向的存储单元都位于字符缓冲区中。Copyrightfunnywei2003通过其他方法判断缓冲区长度通过其他方法判断缓冲区长度 有些程序来说,在分配了缓冲区后首先调用函数对其进行初始化。只要找到相应的API函数调用就很容易判断出目标缓冲区的大小和起始位置。chardest100;.ZeroMemory(dest,100);.memset()函数在Release版本的程序中会被编译成一条汇编语句 rep stos。Copyrightfunnywei2003基于污点传播的双向数据流分析基于污点传播的双向数据流分析思想思想:来源于Perl中称为“tainting”的机制。监控所谓的

13、“不可信数据”,通常是由用户输入的,将这些输入标记为“tainted”。污点数据通过程序语句进行传播。污点来源:污点来源:环境变量,参数,文件,网络输入污点传播在源码检测中的运用污点传播在源码检测中的运用在二进制代码中的应用在二进制代码中的应用双向数据流分析方法双向数据流分析方法Copyrightfunnywei2003污点传播在源码检测中的运用污点传播在源码检测中的运用在数据类型前,加一个tainted类型限定词表示该数据来源于一个不可信数据源。例如:intmain(intargc,taintedchar*argv);例:wuftpd的格式化字符串漏洞。|-site_exec|-lreply

14、|-vreplyCopyrightfunnywei2003简化看作:简化看作:while(fgets(buf,sizeof buf,f)lreply(200,buf);void lreply(int n,char*fmt,)vsnprintf(buf,sizeof buf,fmt,ap);现实中formatstring的例子并不太可能是显式的使用prinft(buf)这么容易检测。而且多数情况下,真正出错的地方很有可能与最终调用vsnprinft,prinft的函数并不在一个源文件中。例如,上面所举的wuftp“siteexec”例子,其分别在ftpcmd.y文件中ftpd.c文件中。Copy

15、rightfunnywei2003偏序关系偏序关系考虑例子:voidf(taintedint);untaintedinta;f(a)f期望的是tainted数据,而传入的是untainted的参数。允许!考虑第二个例子:voidg(untaintedint);taintedintb;g(b);在这种情况下,g期望untainted而得到tainted的数据,不允许!把两个例子结合起来,我们得到下面的偏序关系:untaintedinttaintedintCopyrightfunnywei2003在二进制代码中的应用在二进制代码中的应用双向数据流分析方法双向数据流分析方法一是从污点数据流开始分析,

16、自上而下形成一棵传播树(PropagationTree)。二是从strcpy等可能出错的函数开始,向上回溯。找到两者相交的位置,从而产生污染流路径(TaintedFlowPath)。当然相交的位置可能不止一处,那么将产生多条污染流路径。Copyrightfunnywei2003动态分析及测试过程动态分析及测试过程思想:思想:动态拦截所有可疑的函数,在拦截时创建当前调用的虚拟栈列表。在栈列表中,记录所有函数缓冲区的情况。对于可疑函数所使用的缓冲区,先分析它是位于堆中还是在栈中。接着,获得相应的数值化描述信息,最后与限制条件相比,得到分析结果。Copyrightfunnywei2003虚拟栈虚拟栈

17、虚拟栈用来记录栈的调用情况。同样,在分析的过程中还可以很方便的定位出所分析的字符缓冲区在堆栈中的位置,生存周期等。Copyrightfunnywei2003缓冲区数值化技术及限制条件的产生缓冲区数值化技术及限制条件的产生David Wagner等人在参考文献1中将缓冲区溢出的检测问题规范化为整数限制的问题,并定义了限制语言(Constraint Language)。Copyrightfunnywei2003限制条件的产生限制条件的产生符号len(s)表示当前使用的长度(包含结束字符0),范围属性为a,b。Alloc(s)表示buffer实际分配的大小,范围属性为c,d。在对所有的变量进行了范围

18、推断之后,再进行安全属性检查:如果bd,那么肯定发生。如果dbca,那么溢出有可能发生。Copyrightfunnywei2003堆指针检测的红黑树结构及魔数定位法堆指针检测的红黑树结构及魔数定位法思想:拦截堆内存的分配函数(例如,Windows下拦截RtlHeapAlloc,Linux下拦截malloc)。在每次成功分配堆内存的时候,采用红黑树记录堆指针,或者在刚分配的堆内存的起始位置记录Meta Data信息。Copyrightfunnywei2003红黑树(红黑树(Red/Black Tree)检测)检测树中的每个节点对应于一个已分配内存,其关键字包含block的起始和结束地址。其插入和

19、删除的时间复杂度为O(logn),采用红黑树而不采用二叉树主要是为了避免最坏情况的产生。导致时间复杂度为O(n)。例子:addr(A1)addr(A2)addr(A5)Copyrightfunnywei2003魔数定位法(魔数定位法(Magic Number Location)思想:使用一个特殊的数据结构记录在动态内存的开始地址,叫做 Meta Data。采用魔术定位法可以减少插入和删除的复杂度。其搜索时间为O(1),即线性时间。Copyrightfunnywei2003在每个分配的动态内存块的开始部分插入一个头部,来存储特定的元数据。元数据包含两个部分,一个是魔数,一个是表的索引值。魔数是元

20、数据的第一部分,它是精心选择的一个数,在正常的用户程序里不太可能出现。表的每条记录包含了已分配块的地址和大小。对于指针p,搜索其前面的内存来匹配魔数。如果没有匹配,就不可能是一个内存块的起始位置。反之,如果匹配,那么就有可能是我们找到了起始点。当然,很有可能魔数在用户区域里巧合。在魔数相匹配后,再根据index查找表中的相应位置存储的Start值来比较起始地址是不是和分配块的地址一致。Copyrightfunnywei2003进程跟踪与调试进程跟踪与调试捕获函数调用异常(对于Windows而言)DebugActiveProcess attach到一个活动进程。终止调试使用DebugActive

21、ProcessStop。任何时候,被调试的进程发生发生异常都会产生EXCEPTION_DEBUG_EVENT事件,可能的异常包括试图访问不可访问的内存,执行断点指令,试图被0除,或者任何其他SEH处理的异常。Ptrace跟踪,LKM拦截异常(对于Linux)*NIX系统下可以采用可加载内核模块(LKM)拦截系统的异常中断。具体方法可以参考Phrack61的HijackingLinuxPageFaultHandlerExceptionTable。Copyrightfunnywei2003发生异常时的现场数据保护发生异常时的现场数据保护现场记录的信息包括:线程上下文、程序加载的模块信息、调用栈信息、虚拟栈信息。线程上下文GetThreadContext被监视进程的符号表SymInitialize加载。遍历被监测进程的堆栈StackWalk遍历。程序加载的模块信息EnumerateLoadedModules虚拟栈信息保存,便于定位出错。Copyrightfunnywei2003总结总结试图提出一个针对缓冲区溢出的发掘模型,但还有很多工作没有做。包括Fuzzer的自动化教本引擎等工作。同时,本文所叙述的工作中,仍有许多并没有进行效率的测试和在实践中进行检测。这都需要在将来进行完善和测试。Copyrightfunnywei2003Thanks!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com