4.4 整型溢出实验
4.4.1 实验目的
本实验要求掌握整型溢出的原理,了解宽度溢出和符号溢出的发生过程。
4.4.2 实验内容及环境
1.实验内容
本实验使用 VC 6.0 的源码调试功能,尝试不同的程序输入,并跟踪变量和内存的变化,以观察不同整型溢出的原理。
2.实验环境
(1)靶机系统环境为 Windows XP SP3 32 位;
(2) VC 6.0,具体详见本书 4.3 节的介绍。
4.4.3 实验步骤
1.编译代码
通过 VC 6.0 将以下两段代码分别编译成 debug 版的 t1.exe 和 t2.exe。
//整型宽度溢出
1 intmain(intargc, char *argv[]){
2 unsigned short s;
3 inti;
4 char buf[10];
5 i = atoi(argv[1]);
6 s = i;
7 if(s >= 80){
8 printf("错误!输入不能超过 10! \n");
9 return -1;
10 }
11 memcpy(buf, argv[2], i);
12 buf[i] = '\0';
13 printf("%s\n", buf);
14 return 0;
15 }
//整型符号溢出
1 int main(intargc, char *argv[]){
2 char kbuf[800];
3 int size = sizeof(kbuf);
4 intlen = atoi(argv[1]);
5 if(len> size){
6 printf("错误!输入不能超过 800! \n");
7 return 0;
8 }
9 memcpy(kbuf, argv[2], len);
10 }
2.加载程序
使用 VC 6.0 调试 t1.exe,在程序参数栏填入“100aaaaaaaaaaaaaaaa”,如图 4.7 所示,按“Ctrl” +“F5”组合键运行。
3.检查参数
由于参数 i 的值大于 10,不能通过第 7 行的条件判断,程序运行显示“错误!输入不能超过 10!”后退出。
4.修改参数
修改参数 i 的值为 65537,并在第 6 行设置一个断点,按“F5”键运行。
5.观察运行环境
程序停在断点处,观察 VC 6.0 程序运行的上下文窗口,注意此时“i=0x00010001(65537)”,如图 4.8 所示。