带缓冲区溢出的代码示例(获取方法).为什么它不像预期的那样?

cit*_*nas 2 c buffer-overflow

这是来自ac程序的摘录,应该演示缓冲区溢出.

void foo()
{
  char arr[8];
  printf(" enter bla bla bla");
  gets(arr);
  printf(" you entered %s\n", arr);
}
Run Code Online (Sandbox Code Playgroud)

问题是"如果没有创建缓冲区溢出,用户最多可以输入多少个输入字符"

我最初的答案是8,因为char数组长8个字节.虽然我非常肯定我的答案是正确的,但我尝试了更多的字符,并且发现在我出现分段错误之前我可以输入的字符数限制是11.(我在A VirtualBox Ubuntu上运行它)

所以我的问题是:为什么可以在8字节数组中输入11个字符?

Fog*_*ird 6

您的角色实际上超出了已定义数组的范围,导致未定义的结果.在覆盖用于其他内容的某些内存之前,您不会看到效果.

语言和运行时没有做任何事情来阻止你溢出缓冲区,这正是为什么这些错误是如此糟糕,有时难以追踪.

由于这些原因,gets对于更安全的函数(getline在这种情况下)要求数组长度存储数据的函数会被弃用.

请参阅:http://crasseux.com/books/ctutorial/gets.html

此外,您只能可靠地存储7个字符,因为您需要第8个空终止符.