缓冲区溢出演示
- 代码部分
#include <stdio.h>
#include <stdlib.h>
/*库函数gets()的实现*/
char *gets(char *dest)
{
int c = getchar();
char *p = dest;
while (c != EOF && c != '\n') { //当c不等于文件结束符且不等于换行符时
*p++ = c;
c = getchar();
}
*p = '\0'; //在最后一个单元填上'\0',形成字符串
return dest; //返回输入的字符串
}
/*读取输入行并将其写回*/
void echo()
{
char buf[4]; //定义的字符数组长度太小!
gets(buf);
puts(buf);
}
void call_echo()
{
echo();
}
int main()
{
printf("Type a string:");
call_echo();
return 0;
}
- 实验结果
字符数组buf[4]在要留一个存储单元存储’\0’,故只能输入三个字符,但此时输入0123却没有溢出,我们执行objdump -S a.out指令得到它的反汇编代码来寻找原因
事实上0123中的第四个字符并没有破坏存储的返回地址的值,否则,ret指令会导致程序跳转到一个意想不到的位置,当输入01234时显然栈溢出。由此可见gets函数的使用是有风险的,最好不要随便使用。