缓冲区溢出攻击与防范实验报告_第1页
缓冲区溢出攻击与防范实验报告_第2页
缓冲区溢出攻击与防范实验报告_第3页
缓冲区溢出攻击与防范实验报告_第4页
缓冲区溢出攻击与防范实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、缓冲区溢出攻击与防范实验报告 计算机网络(2)班 V200748045黄香娥1·缓冲区溢出的概念: 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区 又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。2·缓冲区溢出的危害: 在当前网络与分布式系统安全

2、中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。3·缓冲区溢出原理: 由一个小程序来看: /test.c#include "stdio.h" #include "stdlib.h" #include "string.h" void overflow(

3、void) char buf10; strcpy(buf,"0123456789123456789"); /end overflow int main(void) overflow(); return 0; /end main按F11进入"Step into"调试模式,如下:按F11跟踪进入overflow,让程序停在6,现在再看一下几个主要参数 :esp=0x0012ff30,eip发生了变化,其它未变。很显然堆栈里压了一个dword(4字节)数据,看看它是什么,打开memory窗口, 输入esp,右击窗口内容,选"Long Hex Form

4、at",当前的堆栈顶内容0x0040108d, 现在请看一下call overflow的下一行,如果找不到请从头搜索"15:"字符串, 可以看到堆栈压入的是call overflow的下一指令地址,也就是我们通常说的"函数返回地址"。 再按F11(执行push ebp),再看一下几个主要参数:esp=0x0012ff2c,现在堆栈顶中是ebp的值0x0012ff80, 现在在看寄存器中只有eip变成了红色,即发生了变化,其他的几个参数均没有变!很显然堆栈里压了一个dword(4字节)数据,看看它是什么,打开memory窗口, 输入esp,右击窗

5、口内容,选"Long Hex Format",再按F11(执行push ebp),再看一下几个主要参数:再按F11(执行下面的语句),程序将当前esp值保存在ebp中: mov ebp,esp 然后就开始分配局部变量了,sub esp,4ch;分配了76(0x4c)个字节,随后的7句指令:将这76个字节以dword(4)为单位填充为0xcccccccc,共填充76/4=19(0x13)次让我们在执行完rep stos dword ptr edi时先停下来.在watch窗口里加入eip和一个表达式 "ebp-0ch",会发现在"ebp-0ch&q

6、uot;和buf的地址一样,这就是编译程序在堆栈中为我们分配的局部内存变量的起始地址,在memory窗口里输入ebp-0ch (变量起始地址),右击窗口选"Byte Format",可以看到里面有12个字节是被0xcc填充过的.在watch窗口加入ebp和buf,并在memory窗口输入"buf"看一下strcpy函数执行以前的堆栈情况,选择 "Long Hex Format",可以看到当前的堆栈情况如下:再往下看,右击选"Long Hex Format"看到它们分别是 0x0012ff80和0x0040108d,

7、这就是"老的ebp"和"函数返回地址",继续跟踪将执行以下几个动作,恢复主要寄存器内容,add esp 4ch销毁了局部内存变量恢复老的ebp(这时堆栈顶的内容为0x0040108d),再ret返回,ret相当于执行了一次"pop eip",并没有这样的指令,这是由系统自己来完成大的。执行完这条指令后eip的内容变为0x0040108d,这时已经回到了主函数中,在主函数中将执行几乎同样的动作,最后完成程序执行。4·防止缓冲区溢出: 缓冲区溢出主要是一个 C/C+ 问题。尽管在通常情况下它很容易修补。但它们仍然是一种对安全代码

8、的威胁。不管是用户也好,程序的攻击者也好,当提供的数据长度大于应用程序预期的长度时,便会发生缓冲区溢出,此时数据会溢出到内部存储器空间。有两种缓冲区溢出不明显且难以修复。一是开发人员没有预料到外部提供的数据会比内部缓冲区大。溢出导致了内存中其他数据结构的破坏,这种破坏通常会被攻击者利用,以运行恶意代码。二是数组索引错误也会造成缓冲区下溢和超限,但这种情况没那么普遍。请看以下 C+ 代码片段: void DoSomething(char *cBuffSrc, DWORD cbBuffSrc) char cBuffDest32; memcpy(cBuffDest,cBuffSrc,cbBuffSr

9、c);问题在哪里呢?事实上,如果 cBuffSrc 和 cbBuffSrc 来自可信赖的源(例如不信任数据并因此而验证数据的有效性和大小的代码),则这段代码没有任何问题。然而,如果数据来自不可信赖的源,也未得到验证,那么攻击者(不可信赖源)很容易就可以使 cBuffSrc 比 cBuffDest 大,同时也将 cbBuffSrc 设定为比 cBuffDest 大。当 memcpy 将数据复制到 cBuffDest 中时,来自 DoSomething 的返回地址就会被更改,因为 cBuffDest 在函数的堆栈框架上与返回地址相邻,此时攻击者即可通过代码执行一些恶意操作。弥补的方法就是不要信任用

10、户的输入,并且不信任 cBuffSrc 和 cbBuffSrc 中携带的任何数据: void DoSomething(char *cBuffSrc, DWORD cbBuffSrc) const DWORD cbBuffDest = 32; char cBuffDestcbBuffDest; #ifdef _DEBUG memset(cBuffDest, 0x33, cbBuffSrc); #endif memcpy(cBuffDest, cBuffSrc, min(cbBuffDest, cbBuffSrc);此函数展示了一个能够减少缓冲区溢出的正确编写的函数的三个特性。首先,它要求调用者提

11、供缓冲区的长度。当然,您不能盲目相信这个值!接下来,在一个调试版本中,代码将探测缓冲区是否真的足够大,以便能够存放源缓冲区。如果不能,则可能触发一个访问冲突并把代码载入调试器。在调试时,您会惊奇地发现竟有如此多的错误。最后也是最重要的是,对 memcpy 的调用是防御性的,它不会复制多于目标缓冲区存放能力的数据。5·实验环境: 要求如下:1. windows2000或者windowsXP操作系统,不要安装杀毒与防火墙软件2. VC6.0开发环境,OllyDbg调试工具3. 安装有Xscan扫描工具以及Sniffer4.5网络监听工具4. 安装有Foxmail邮件收发客户端5. 安装I

12、ceSword系统信息查看工具6. 安装有灰鸽子远程控制软件6·Foxmail5.0缓冲区溢出分析(1)FoxMail简介:是一个中文版电子邮件客户端软件,支持全部的 Internet 电子邮件功能。程序小巧,可以快速地发送,收取,解码信件;远程邮件管理,浏览信件条目后再决定下载或直接删除;此外还有本地邮箱加密功能,多地址簿功能,同时支持 MIME 和 UUEncode 邮件格式,支持 HTML 邮件直接查看(需安装了IE),邮箱助理自动分发新收到的邮件到不同的邮箱,支持多个邮箱帐户,内置 BIG5 码与GB 码转换功能,直接阅读或发送 BIG5 码的邮件,可以从 Outlook、E

13、xchange 等导入/导出邮件,支持 message/partial 格式邮件,自动重组被分割的邮件,包含邮箱监视器 Notifier,等等。(2)Foxmail5.0缓冲区溢出过程: 先新建一个邮件,保存为test.eml。用文本编辑器打开该邮件,设置From:字段内容为400个字节,由重复的0123456789构成,然后用foxmail导入,就会发现出现异常。如图所示: 由图可以看出,出现了0x36353433写错误,这个地址换成字符也就是6543,这说明邮件头不仅仅已经覆盖了EIP,还覆盖了一些变量,导致函数返回时候恢复这些变量不对,结果就写错误,我们可以尝试逐步缩短邮件头,不要覆盖E

14、IP后面的数据,经试验会发现整个From字段为266时候,出现了如图下图的结果:从图中可以看出,当前的EIP被覆盖为0x39383736了,这个时候只需要将该地址数值设置为0x7ffa4512就可以跳转到JMP ESP了。将邮件头最后的四个字节修改为0x7ffa4512,用OllyDbg调试工具打开foxmail,在0x7ffa4512地址设置执行断点,经验证,会发现导入邮件时候会中断在这里,继续往下执行,会发现到了ESP所指向的地址,而该地址前面也就是所填充的From数据内容。由此可知,可以将ShellCode直接放置在0x7ffa4512后面,重新导入,执行。在用OllyDbg调试过程中会发现如果EIP地址后面跟的ShellCode太长,就会写异常,最后调整可知,EIP后面只能跟4字节才能正确实现JMP ESP跳转。这就意味着ShellCode不能跟在EIP后面。可以采取变通的方法,EIP后面的四个字节替换为JMP指令,将ShellCode放在EIP前面,由JMP转到She

温馨提示

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

评论

0/150

提交评论