数组、栈(Linux环境下)
源代码
/* Demonstration of buffer overflow */
#include <stdio.h>
#include <stdlib.h>
/* Implementation of library function gets() */
char *gets(char *dest)
{
int c = getchar();
char *p = dest;
while (c != EOF && c != '\n') {
*p++ = c;
c = getchar();
}
*p = '\0';
return dest;
}
/* Read input line and write it back */
void echo()
{
char buf[4]; /* Way too small! */
gets(buf);
puts(buf);
}
void call_echo()
{
echo();
}
/*void smash()
{
printf("I've been smashed!\n");
exit(0);
}
*/
int main()
{
printf("Type a string:");
call_echo();
return 0;
}
代码解释
- 此代码用于检测数组元素的存储。
- gets //gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。gets解释
- puts //puts()函数用来向标准输出设备(屏幕)输出字符串并换行,具体为:把字符串输出到标准输出设备,将’\0’转换为回车换行。其调用方式为,puts(s);其中s为字符串字符(字符串数组名或字符串指针)。puts解释
- exit(0); //EXIT()是C语言中的一个终止函数。exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束。exit解释
Linux环境下运行结果
结果分析
- 当输入字符串长度小于4时,数据存储在数组定义的储存空间。当输入字符串长度超过4时,字符串中超过的字符会自动存入栈中,输出时为出栈。
- 使用 objdump -s a.out 可查看相应代码的汇编代码。