练习二 缓冲区溢出

更新时间:2023-09-29 21:46:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2012-2013学年第2学期 《网络安全课程设计》实验报告

实验名称: 缓冲区溢出——本地缓冲区溢出 完成时间: 2014.6.18 姓 名: 柳 鑫 学号: 110342118 指导教师: 崔 鸿 班级: 110342A

实验效果

实验报告 总评

任务一 利用跳转指令实现缓冲区溢出

本练习单人为一组。

首先使用“快照X”恢复Windows系统环境。 一.溢出程序演示

(1)进入实验平台,单击工具栏“演示目录”按钮,进入实验目录。进入Mission1目录,双击overflow_win.exe,加载ShellCode执行溢出操作。

二.溢出实现

本练习操作通过缓冲区溢出来实现弹出消息框(MessageBox对话框)。针对windows平台实现缓冲区溢出,该实验实现溢出的方式及流程具有着一定的通用性。

我们需要开发实现两部分内容:一部分是漏洞程序overflow,该程序通过memcpy 函数实现缓冲区溢出(添加shellcode的代码到缓冲区中,使缓冲区溢出),当然你也可以通过其它函数实现溢出。另一部分内容则是生成shellcode,shellcode是程序溢出后欲执行的指令代码,如通过shellcode实现程序溢出后弹出对话框等功能。

对照图22-2-1,在程序正常执行时,memcpy函数被执行完毕后,指令指针会返回至ret地址处,继续执行memcpy函数调用处的后续指令;同时,执行完ret指令后ESP指针也会指向堆栈原始区(调用memcpy函数前一时刻的堆栈分布)。因此,我们可以将溢出代码shellcode存在堆栈原始区,而剩下的工作就是在memcpy执行ret返回时让EIP指针指向原始区(也就是ESP指针指向的地址)即可。如何通过ret返回地址确定此时的堆栈ESP指针指向呢?在这里采用的方法是通过跳转指令“jmp esp”(无条件跳转至esp指向处执行)。通过在用户地址空间中查找到包含有“jmp esp”指令的存储地址,用该地址覆盖ret返回地址就可以了。

在具体实现时,我们通过三个步骤完成缓冲区溢出:

(1)编写前导码。

所谓前导码就是用于覆盖局部变量到ret返回地址之间的堆栈空间(不包括ret返回地址空间)的指令码。前导码仅是用于填充堆栈,所以其内容不受限制。我们需要在实际的调试中来确定前导码的大小。 「说明」 cl、gcc等诸多C编译器在为局部变量申请内存空间时,经常要多出若干字节。 (2)查找jmp esp指令地址。

用”jmp esp”指令的地址覆盖ret,就可以在memcpy执行返回后,让CPU执行跳转指令,所以首要解决的是在用户空间中找到含有“jmp esp”指令的地址。通过VC++6.0的反汇编功能得到“jmp esp”指令的机器码为0xFFE4。利用FindJmpesp工具进行指令查找,确定一个含有“jmp esp”指令的内存地址。

「注」在用户地址空间中会存在多个包含有jmp esp指令的地址。

(3)shellcode功能体。

shellcode功能体实现了溢出后主要的执行功能,如创建超级用户,提升用户权限等。在这里我们通过自定义指令来实现弹出用户对话框。

1.编写前导码

单击工具栏“VC6”按钮,启动VC++6.0。选择“File”|“Open Workspace?”加载工程文件“C:\\ExpNIS\\NetAD-Lab\\Projects\\OverFlow\\Mission1\\overflow.dsw”,该工程包含两个项目,overflow和CreateShellcode项目,建议在debug版下进行开发调试。

将overflow项目设置为启动项目(Set as Active Project),该项目仅有一个源文件overflow.c,在此源文件中提供了部分代码,注释的地方需要你根据实际调试结果来填写。 程序中提供了一个超长前导码,你需要对程序进行调试来确定实际需要的前导码长度。调试过程如图22-2-2所示。

实验结果及截图: 设置断点:

遇到ret返回指令:

执行ret指令之后跳转到49484746地址处:

0x46,0x47,0x48,0x49被替换,需要替换成JMP ESP指令地址:

在图22-2-2中可以看出,0x49484746四字节覆盖了ret返回地址,请根据调试结果重新确定shellcode指令集长度,确定ret返回地址能够被前导码的后续4字节覆盖。 2.查找jmp esp指令地址

我们需要在用户地址空间中找到包含有jmp esp指令(机器码为0xFFE4)的地址。运行FindJmpesp工具,选取一个地址追加到shellcode尾(追加填加地址时注意数组高字节对应地址高位),所选jmp esp指令地址是 0x77e424da 。

本文来源:https://www.bwwdw.com/article/acdd.html

Top