第02课:缓冲区溢出原理分析有哪些要点?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2476个文字,预计阅读时间需要10分钟。
创建一个检测缓冲区溢出的程序,以满足达到实验要求。首先编写一个最简单的存在缓冲区溢出的程序。该程序使用VC++6.0编写,并在Windows XP下执行。
创建含有缓冲区溢出隐患的程序
这里我们为了达到实验的要求,先来编写一个最简单的存在缓冲区溢出隐患的程序。这个程序我使用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)。
本文共计2476个文字,预计阅读时间需要10分钟。
创建一个检测缓冲区溢出的程序,以满足达到实验要求。首先编写一个最简单的存在缓冲区溢出的程序。该程序使用VC++6.0编写,并在Windows XP下执行。
创建含有缓冲区溢出隐患的程序
这里我们为了达到实验的要求,先来编写一个最简单的存在缓冲区溢出隐患的程序。这个程序我使用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)。

