缓冲区溢出原理及防范

缓冲区溢出原理及防范

ID:38167967

大小:85.50 KB

页数:5页

时间:2019-05-24

缓冲区溢出原理及防范_第1页
缓冲区溢出原理及防范_第2页
缓冲区溢出原理及防范_第3页
缓冲区溢出原理及防范_第4页
缓冲区溢出原理及防范_第5页
资源描述:

《缓冲区溢出原理及防范》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、摘要:正文:大纲:1.引言;随着网络安全技术的飞速发展,缓冲区溢出漏洞已经成为当前最具安全威胁的漏洞之一,缓冲区溢出攻击也成为一种非常有效而常见的攻击方法。如Internet上的第1例蠕虫(Morris)攻击,就是利用了fingerd的缓冲区溢出漏洞。SANS评选出的2005年威胁最大的20个漏洞中,有8个跟缓冲区溢出有关。根据CNCERT最近几周的计算机安全漏洞的统计数据,与缓冲区溢出有关的安全事件占了很大的比例。这些都充分说明了研究缓冲区溢出的重要性。本文主要介绍了windows下的缓冲区溢出的相关知识。2.漏洞原因和原理;2.1产生原因;当向一个已分配了确定存

2、储空间的缓冲区内复制多于该缓冲区处理能力的数据时,就会发生缓冲区溢出,溢出包括堆溢出和堆栈溢出。它与程序在内存中的分布有关,而它产生的直接原因是由于C/C++程序中的一些函数调用时,没有进行边界检查,如C函数库中的strcpy(),strcat(),sprintf(),gets()等都是不安全的。由上面的分析可知要产生缓冲区溢出,需要有几个条件:1)程序编译时在堆栈上分配了固定大小的缓冲区,并且在对缓冲区进行访问时没有提供边界检查。这条在C/C++语言中就满足,而对于有边界检查的语言,如Pascal等,就没有这样的溢出问题。2)程序调用了没有进行边界检查的函数来访问

3、(写操作)缓冲区,这些函数没有对访问的缓冲区的大小进行判断。由于在C语言中,字符串以0字节来标识结尾,其中没有字符串的长度信息,所以几个没有判断字符串长度的字符串拷贝函数就是容易出现问题的函数。这些函数有:strcat()、strcpy()、sprintf()等。3)即使程序使用了上面所说的问题函数也不一定会出现溢出漏洞,漏洞发生的最后一个条件是程序员由于粗心,未检查用户输入数据的长度就将其直接复制到缓冲区中去。虽然这看起来是一件小事,很容易杜绝。可惜的是正因为有大量粗心的程序员的存在,使得溢出漏洞变得非常的普遍。2.2原理;图1堆栈缓冲区示意图程序的堆栈是先进后出

4、的一种数据结构,堆栈的生长方向适合内存相反的(如图1)。当调用一个函数时,首先是函数的参数逆序进栈,然后将eip里面的内容进栈作为函数的返回地址(ret),即函数调用结束后程序跳转的地址,接着保存现在程序的栈基指针(ebp),并将当前栈顶指针(esp)拷入ebp作为新的基地址.最后将esp减去一定数值用来为本地变量留出一定空间。缓存区往往就分配在这段空间中。由于堆栈是由内存高地址向内存低地址方向增长,而数组的变量是从内存低地址向高地址方向增长,这时如果没有对数组的越界进行检查和限制,通过向程序的数组缓冲区写入超出其长度的内容,覆盖堆栈原来的返回地址(ret),就会造

5、成缓冲区溢出,从而破坏程序的堆栈。如果构造特殊的注入向量覆盖ret值使程序转而执行恶意代码(shellcode),就达到攻击的目的。1.基于缓冲区漏洞的攻击过程;由上所述可知,堆栈缓冲区溢出漏洞的攻击利用的3个步骤是:1)溢出点ret的定位;定位ret的流程是用一定格式的字符串覆盖存在溢出漏洞的缓冲区,使程序溢出,然后根据溢出结果计算ret的位置。最常用的方法是利用报错对话框精确计算出溢出返回点的方法,如图2中的报错对话框所示,可以看到是“0x79797979”覆盖到了溢出点。依次类推,我们可以不断给一个数组反复赋值,利用整除和求余等数学方法来精确计算溢出点的位置。

6、图2溢出报错对话框2)构造shellcode;确定下来溢出点位置后,就需要有可以执行的shellcode来达到入侵的目的。shellcode的编写主要有两种lodsd方法,一是用C等高级语言编写经反汇编后提取二进制码。二是直接使用汇编语言编写并提取二进制码。使用c语言编写生成的代码较长,但编写调试简单,且可以根据不同的需要灵活更改代码。而利用汇编语言生成的代码更为简练,但调试复杂,一旦编写成功后不易修改。3)用特定地址覆盖ret并且使其跳转到shellcode,并执行。是将返回点覆盖成jmpesp或callebx的地址。为了通用性使用kernel32.dll中的指令

7、地址.因为同一系统中该模块装载地址变化可能小。覆盖方法主要有两种:①NNNNNNNNNSSSSSSSSSSSRRRRRRRRRRRRRR型。适合于大缓冲区,“N”代表空指令(NOP),也就是0x90,在实际运行中,程序将什么也不做,而是一直延着这些NOPS运行下去,直到遇到不是NOPS的指令再执行之;“S”代表ShellCode;“R”代表覆盖的返回地址,思路是把返回地址R覆盖为nops的大概位置,这样就会跳到Nop中,然后继续执行,直到我们的ShellCode中。但这种方法由于定位不准确,所以使用起来也不准确。②RRRRRRRRRRNNNNNNNNNNNSSS

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。