スタックオーバーフローを引き起こし、Segmentation fault
を得る明らかな方法の1つは、スタックフレームがブームになるまでスタックフレームを繰り返し積み重ねることです。私はスタックオーバーフローが新しいスタックフレームを押すことなしに起こるかどうか疑問に思っています。新しいスタックフレームを押さずにスタックをオーバーフローさせるには?
十分な大きさのアレイを作成すると、経験から得られる可能性がありますが、それ以外のシナリオは可能ですか?
スタックオーバーフローを引き起こし、Segmentation fault
を得る明らかな方法の1つは、スタックフレームがブームになるまでスタックフレームを繰り返し積み重ねることです。私はスタックオーバーフローが新しいスタックフレームを押すことなしに起こるかどうか疑問に思っています。新しいスタックフレームを押さずにスタックをオーバーフローさせるには?
十分な大きさのアレイを作成すると、経験から得られる可能性がありますが、それ以外のシナリオは可能ですか?
C99はサイズ変更可能な配列を使用します。サイズ変更可能な配列を使用してサイズを変更することができます。しかし、このサイズ変更可能な配列はalloca
を使用して実装されています。ここではサンプルコードでは、UNIXのenvをにあります:
#include <stdio.h>
#include <alloca.h>
#include <stdlib.h>
#include <stdbool.h>
int
main()
{
while (true)
{
void *p = alloca(32UL);
printf("new memory allocated at %p \n", p);
}
exit(EXIT_SUCCESS);
}
そして、あなたの出力は、この
new memory allocated at 0xbf800a60
new memory allocated at 0xbf800a30
new memory allocated at 0xbf800a00
new memory allocated at 0xbf8009d0
new memory allocated at 0xbf8009a0
[1] 3977 segmentation fault ./a.out
alloca
ようになりますが、それは調整することにより、スタック上にメモリを割り当てられたことを除いて、機能のmalloc
家族でありますスタックポインタ
乱用alloca()
または_alloca()
は、Windows SDK/VSで開発している場合:
のalloca()関数は、呼び出し元 のスタックフレーム内のスペースのsizeバイトを割り当てます。
注_alloca()
の代わりに、_malloca()
が推奨されています。
基本的には、「スタック」はほんの一部のメモリであり、スタックオーバーフローはESP/EBPがこのメモリの境界から外れるときです。 int x[10000000];
__asm mov esp, 0x0
あなたは、いくつかの方法でこれを達成することができます現在の関数がほどけたときに破損、スタックので、ESP/EBPはゴミのように設定されます。int x; memset(&x, 0, 10000000);
とCOUNあなたのスタックサイズより大きな配列を宣言して使用することによりtless他の方法...
:実行時に
$ ulimit -s
8192
$
その後、
int main(void)
{
volatile char bla[8192 * 1024 + 16] = {0};
}
は、セグメンテーションフォールトする可能性があります。
なぜvolatileと入力しますか?私の例では –
は、コンパイラがプログラムのどこかで使われていないので、それを最適化するのを避けるためです。 'for'ループを使って' printf'を使ってすべての要素を出力すると、コンパイラはそれを最適化できないので、 'volatile'修飾子は必要ありません。 – ouah
これはLinux/UNIX環境になります。 –
'alloca'とVLAです。 – Mat