网络安全实验报告 - 缓冲区溢出攻击

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一实验名称

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

定位参数地址实现缓冲区溢出

二实验目的

1.熟练掌握缓冲区溢出原理

2.利用jmp esp指令实现缓冲区溢出

3.熟练掌握缓冲区溢出原理

4.利用定位参数地址实现缓冲区溢出

三实验步骤

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

1.编写前导码

程序中提供了一个超长前导码,对程序进行调试来确定实际需要的前导码长度

在图中可以看出,0x49484746四字节覆盖了ret返回地址

2.查找jmp esp指令地址

运行FindJmpesp工具,选取一个地址追加到shellcode尾(追加填加地址时注意数组高字节对应地址高位),所选jmp esp指令地址是

0x77e424da

跟踪调试程序,确定在memcpy执行返回时jmp esp指令是否被执行

从图看出,在jmp esp指令执行完毕后,指令指针紧接着执行了3个空指令,而空指令是追加在shellcode尾部的

3.生成实现弹出对话框的指令码

MessageBoxA函数的绝对内存地址,该地址为

0x77E10000+0x0003D8DE=0x77E4D8DE

函数ExitProcess的绝对内存地址

0x7C800000+0x00013039=0x7C813039

利用反汇编功能获取代码字节,将代码字节以十六进制数据形式继续追加到shellcode尾。重新编译执行。

定位参数实现缓冲区溢出

1.进入工程

2.生成shellcode功能体

(1)首先设置OverFlowClient项目为启动项。

(2)使用Depends工具打开FindShellBase.exe文件定位上述内存地址kernel32.dll 0x7C800000

LoadlibraryA 0x7C800000+0x00001E60=7C801E60

SHELL32.DLL 0x7CA10000

shellExecuteA 0x7CA10000+0x0008F6D4=0x7CA9F6D4

(3)编译并生成OverFlowClient.exe,执行OverFlowClient.exe,确定系统是否新建了jlcss用户,并隶属Administrators组。

3.生成shellcode指令码

(1)设置CreateShellCode为启动项。

(2)填写的宏数值:

①获取SHELLCODE_BODY_START、SHELLCODE_BODY_LEN值

调试OverFlowClient.exe(将该项目设置为启动项)确定ShellCode函数入口偏移地址及函数体大小,调试过程参见图22-2-6所示。

开始地址0x00401020

结束地址0x004011B6

②根据调试结果填写CreateShellCode.cpp源文件中SHELLCODE_BODY_START 宏和SHELLCODE_BODY_LEN宏的值。

③其它数值需要通过调试OverFlowServer来获取,而OverFlowServer的执行又依赖于shellcode.shc文件,所以暂且编译生成CreateShellCode.exe文件,执行该文件生成临时shellcode.shc文件。

4.调用OverFlowServer

(1)OverFlow正常调用返回时的下一条指令地址。

调整TempBuffer缓冲区大小,使其大于临时shellcode指令码长度。调试获取OverFlow函数正常调用执行后的下一条指令地址。

填写该指针地址到CreateShellCode.cpp文件中。

(2)OverFlow函数调用前ebp基地址指针。

单步调试程序定位到OverFlow函数入口处,获取此时的EBP指针地址

填写EBP指针地址到CreateShellCode.cpp文件中。

(3)调用OverFlowServer.exe确定OverFlow调用执行过程中TempBuffer缓冲区的首地址。

将TempBuffer缓冲区首地址填写到CreateShellCode.cpp文件中。运行Createshellcode.exe生成完整的shellcode.sh文件

5.调试确定TempBuffer缓冲区大小

调试OverFlowServer.exe得到OverFlow调用返回时的地址,将返回地址与shellcode.shc中的十六数相比较,有三种比较结果:

(1)返回地址是shellcode最后4字节数据。函数返回时执行shellcode。

(2)返回地址没有在shellcode.sh中,缓冲区空间过大,溢出未发生。可以缩小缓冲区空间或在最后8个字节前用0x90(空指令)补充。

(3)返回地址在shellcode.shc中(不是最后4字节数据),缓冲区空间过小。放大缓冲区空间。

当改变TempBuffer缓冲区大小时,其首地址可能会发生变动,调试确定TempBuffer首地址,重新填写CreateShellCode.cpp,并重新生成shellcode.shc。

调试可知:overflow入口地址为0x00401102,子程序返回地址应为0x00401107

调试至jump,找到程序将返回地址存在0x0012FB1C处

调试进入memcpy,发现shellcode从0x0012F968处开始写

由此可算出shellcode的长度应为0x0012FB1C+4-0x0012F968=0x1B8=440,缓冲区大小应设为432

相关文档
最新文档