缓冲区溢出分析第02课: 缓冲区溢出的原理

创建含有缓冲区溢出隐患的程序

这里我们为了达到实验的要求,先来编写一个最简单的存在缓冲区溢出隐患的程序。这个程序我使用VC++6.0进行编写,并在Windows XP下执行。(这里请大家注意的是,如果你使用的是新版本的VC,由于微软加入了GS机制来防止缓冲区溢出情况的出现,那么本实验就无法实现。)

首先新建一个Win32控制台应用程序,然后输入以下C语言代码:

#include "stdio.h"#include "string.h"char name[] = "jiangye";int main(){char buffer[8];strcpy(buffer, name);printf("%s\n",buffer);getchar();return 0;} 编译生成Debug版,运行结果如下:

图1

可见程序已经得到了正确的执行与输出。但是我在程序中所创建出来的是一个8字节长度的数组,而我在程序中的输入是7个字节。如果我的输入超过八个字节会怎么样呢?不妨试一下。

这次再次运行程序,尝试输入“jiangyejiangye”,运行结果如下:

图2

可见,程序虽然也能够正确输出,但是却弹出了错误提示对话框。为什么会出现这种情况?我们接下来就来研究一下。

判定main函数的地址 我们首先来研究一下正常的程序(OverrunTest_1.exe)。打开OllyDbg,载入上面所编写的exe程序。由于我们需要从main函数开始分析,但是OD并没有在main函数处停下,而停在了一系列初始化的反汇编代码中,如下图所示:

图3

这些都是系统自动生成的,与我们的实验无关,我们在此也无需关注这些代码的功能。对于本次实验来说,我们只要找到main函数,从而进一步分析即可。那么应当如何寻找main函数呢?当然我们可以不断地按F8单步执行,通过观察获取,但是这样未免需要一定的经验,而且也比较麻烦。所以这里不妨利用IDA Pro来打开我们的实验程序,如下图所示:

图4

可见,IDA已经帮我们获取了main函数的入口地址,即0x00401010,那么我们此时可以在OD中,跳到该地址,按F2下一个断点。如下图所示:

图5

定位调用main函数的语句

由上面的截图,我们除了可以知道main函数的位置外,我们还从下面那段话“Jump from 00401005”得知main函数是由位于0x00401005位置处的语句跳过来的。由于缓冲区溢出是与栈空间紧密相关的,所以我们现在应当分析调用(CALL)main函数前后,栈空间的情况,所以这里我们就需要定位究竟是哪条语句调用了main函数。如果仅仅通过OD,我们是比较难定位的,所以这里我还是使用IDA Pro。

由于已经知道main函数的地址是0x00401010,那么我们在IDA中,用鼠标在该地址点一下,之后利用快捷键“Ctrl+X”打开“交叉引用窗口”,就来到了jmp到此的函数位置:

图6

然后在0x00401005的地址处,再次利用“交叉引用”功能,我们就能够找到调用main函数的位置了:

图7

现在就已经知道,是位于0x00401694处的语句调用了main函数,那么我们下一步的工作就是分析该语句执行前后,堆栈的情况。

分析CALL语句对于栈的影响 在OD中,执行到0x00401694位置处,如下图所示:

图8

天才是百分之一的灵感加上百分之九十九的努力

缓冲区溢出分析第02课: 缓冲区溢出的原理

相关文章:

你感兴趣的文章:

标签云: