实用文档
一 实验名称
利用跳转指令实现缓冲区溢出 定位参数地址实现缓冲区溢出 二 实验目的
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缓冲区大小