生成堆栈溢出

时间:2008-12-25 15:00:08

标签: c linux stack-overflow

如何在GNU / linux中创建堆栈溢出的条件?

8 个答案:

答案 0 :(得分:12)

一个没有出路的递归函数应该做的伎俩

伪代码,我的c有点生锈

void stack_overflow()
{
   stack_overflow();
}

答案 1 :(得分:9)

我建议阅读phrack杂志文章"Smashing the stack for fun and profit"。 它还包含示例代码。

答案 2 :(得分:4)

code samples in the Wikipedia article。为什么你想让一个人超越我...

答案 3 :(得分:4)

您只需要考虑在C中使用堆栈的内容。

  • 动态内存分配(使用malloc())使用堆;
  • 局部变量和函数调用堆栈使用堆栈。

所以,你所要做的就是耗尽筹码。对函数或大型局部变量创建的无限递归(不要让它们通过超出范围来清除)应该这样做。

答案 4 :(得分:1)

使用alloca()或strdupa()

答案 5 :(得分:1)

其他答案中提到了很多例子。但是每个人似乎都错过了这一点。

要强制堆栈溢出,需要了解堆栈的大小。在linux中,堆栈的默认大小为8MB。

 ulimit -a         //would give you the default stack size 
 ulimit -s 16384   // sets the stack size to 16M bytes

因此,如果您将堆栈大小调整得那么小,那么即使使用100个整数数组也可以强制堆栈溢出。

答案 6 :(得分:0)

最简单的方法就是声明一个足够大的自动堆栈变量。不需要递归或alloca。有趣的是,这不是编译时错误。所需的大小因平台而异:

#define SIZE 10000000

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

答案 7 :(得分:0)

“如何在linux中创建堆栈溢出的条件”

与在Windows上创建堆栈溢出的方式相同。

杰森的答案可能有用,但有些编译器将其优化为循环。我认为添加一个参数可以解决这个问题:

    int Add(int num)
    {
        num += Add(num);
        return num;
    }