0

GNU/linux でスタック オーバーフローの状態を作成する方法は?

4

8 に答える 8

12

抜け道のない再帰関数でうまくいくはずです

疑似コード、私の c は少し錆びています

void stack_overflow()
{
   stack_overflow();
}
于 2008-12-25T15:07:30.033 に答える
9

phrack マガジンの記事「Smashing the stack for fun and Profit」を読むことをお勧めします。サンプルコードも含まれています。

于 2008-12-25T16:34:18.127 に答える
4

ウィキペディアの記事 にコード サンプルがあります。なぜあなたがそれを引き起こしたいのかは私を超えています...

于 2008-12-25T15:07:24.620 に答える
4

C でスタックを使用するものについて考える必要があるだけです。

  • 動的メモリ割り当て ( with malloc()) はヒープを使用します。
  • ローカル変数と関数呼び出しスタックはスタックを使用します。

したがって、スタックを使い果たすだけです。関数の無限再帰または大規模なローカル変数の作成 (スコープ外に出てもクリーンアップさせないでください) のいずれかでそれを行う必要があります。

于 2008-12-25T15:08:23.510 に答える
1

alloca() または strdupa() を使用

于 2008-12-25T15:29:32.250 に答える
1

ここでは、他の回答で多くの例が参照されています。しかし、誰もがこれを見逃しているようです。

スタック オーバーフローを強制するには、スタックのサイズを理解する必要があります。Linux では、スタックのデフォルト サイズは 8MB です。

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

したがって、スタックサイズをそれほど小さく調整すると、たとえば 100 個の整数の配列でもスタックオーバーフローを強制できます。

于 2012-07-04T21:50:47.583 に答える
0

最も簡単な方法は、十分な大きさの自動スタック変数を宣言することです。再帰や割り当ては必要ありません。興味深いことに、これはコンパイル時のエラーではありません。必要なサイズはプラットフォームによって異なります。

#define SIZE 10000000

int main(int argc, char **argv)
{
    char a[SIZE];
}
于 2008-12-26T11:32:15.443 に答える
0

「Linuxでスタックオーバーフローの条件を作成する方法」

Windowsでスタックオーバーフローを作成するのと同じ方法です。

ジェイソンの答えはうまくいくかもしれませんが、一部のコンパイラーはそれをループに最適化します。パラメータを追加することでうまくいくと思います。

    int Add(int num)
    {
        num += Add(num);
        return num;
    }
于 2008-12-26T12:23:22.563 に答える