如何启用缓冲区溢出?

如何启用缓冲区溢出?

我刚刚安装了 12.04(实际上是 WUBI),我想了解一点缓冲区溢出。不幸的是,当我尝试以不正确的方式(即导致缓冲区溢出)使用类似puts()和的函数时,系统会告诉我它检测到并终止我的程序。gets()gccsmashing the stack

如何启用堆栈溢出?

为了更加清楚,这是程序:

#include<stdio.h>

CanNeverExecute()
{
    printf("I can never execute\n");
    exit(0);
}

GetInput()
{
    char buffer[8];

    gets(buffer);
    puts(buffer);
}

main()
{
    GetInput();

    return 0;
}

答案1

我不认为你正在做的事情是堆栈溢出。当你对函数进行过深的递归时,堆栈溢出会导致你用尽堆栈框架。

int main(int argc, char *argv[]) {
    return main(argc, argv);
}

您要实现的是堆栈上的缓冲区溢出。我认为您希望写入返回地址,然后使其调用CanNeverExecute

然后,您将从堆栈保护程序stack smashing detected中获得。您可以使用禁用它。当然,不要gccgcc -fno-stack-protector曾经对您打算在生产中运行的程序执行此操作。

答案2

首先,不建议以不正确的方式使用任何函数。即使你这样做,大多数情况下代码也不会工作。

此外,据我所知,“Stack Overflow”是一个运行时错误,通常当您尝试存储大于分配堆栈大小的内容时发生。

答案3

您不能“启用堆栈溢出”——这是 C 和其他语言中可能发生的一类错误的名称。请参阅维基百科文章了解详情。

因此,基本上,堆栈溢出就是程序中发生的情况以及导致程序终止的原因。

在一个简单的程序中,要么长时间盯着代码直到发现错误,要么使用调试器(称为gdb)一步一步地执行程序,这样应该有助于您找到问题。

答案4

Stack Overflow 上的这个问题列出了多种语言中几乎所有可能导致 Stack 溢出的方式。

相关内容