GNU/linux でスタック オーバーフローの状態を作成する方法は?
8 に答える
抜け道のない再帰関数でうまくいくはずです
疑似コード、私の c は少し錆びています
void stack_overflow()
{
stack_overflow();
}
phrack マガジンの記事「Smashing the stack for fun and Profit」を読むことをお勧めします。サンプルコードも含まれています。
ウィキペディアの記事 にコード サンプルがあります。なぜあなたがそれを引き起こしたいのかは私を超えています...
C でスタックを使用するものについて考える必要があるだけです。
- 動的メモリ割り当て ( with
malloc()
) はヒープを使用します。 - ローカル変数と関数呼び出しスタックはスタックを使用します。
したがって、スタックを使い果たすだけです。関数の無限再帰または大規模なローカル変数の作成 (スコープ外に出てもクリーンアップさせないでください) のいずれかでそれを行う必要があります。
alloca() または strdupa() を使用
ここでは、他の回答で多くの例が参照されています。しかし、誰もがこれを見逃しているようです。
スタック オーバーフローを強制するには、スタックのサイズを理解する必要があります。Linux では、スタックのデフォルト サイズは 8MB です。
ulimit -a //would give you the default stack size
ulimit -s 16384 // sets the stack size to 16M bytes
したがって、スタックサイズをそれほど小さく調整すると、たとえば 100 個の整数の配列でもスタックオーバーフローを強制できます。
最も簡単な方法は、十分な大きさの自動スタック変数を宣言することです。再帰や割り当ては必要ありません。興味深いことに、これはコンパイル時のエラーではありません。必要なサイズはプラットフォームによって異なります。
#define SIZE 10000000
int main(int argc, char **argv)
{
char a[SIZE];
}
「Linuxでスタックオーバーフローの条件を作成する方法」
Windowsでスタックオーバーフローを作成するのと同じ方法です。
ジェイソンの答えはうまくいくかもしれませんが、一部のコンパイラーはそれをループに最適化します。パラメータを追加することでうまくいくと思います。
int Add(int num)
{
num += Add(num);
return num;
}