网络安全实验报告 - 缓冲区溢出攻击
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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