2012-04-11 10 views
5

スタックオーバーフローを引き起こし、Segmentation faultを得る明らかな方法の1つは、スタックフレームがブームになるまでスタックフレームを繰り返し積み重ねることです。私はスタックオーバーフローが新しいスタックフレームを押すことなしに起こるかどうか疑問に思っています。新しいスタックフレームを押さずにスタックをオーバーフローさせるには?

十分な大きさのアレイを作成すると、経験から得られる可能性がありますが、それ以外のシナリオは可能ですか?

+0

これはLinux/UNIX環境になります。 –

+1

'alloca'とVLAです。 – Mat

答えて

3

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家族でありますスタックポインタ

1

乱用alloca()または_alloca()は、Windows SDK/VSで開発している場合:

のalloca()関数は、呼び出し元 のスタックフレーム内のスペースのsizeバイトを割り当てます。

_alloca()の代わりに、_malloca()が推奨されています。

1

基本的には、「スタック」はほんの一部のメモリであり、スタックオーバーフローはESP/EBPがこのメモリの境界から外れるときです。 int x[10000000];

  • はESPを直接設定します:__asm mov esp, 0x0
    1. が残っているスタック領域のサイズよりも大きいです巨大なスタック割り当ての配列を作成します。

      あなたは、いくつかの方法でこれを達成することができます現在の関数がほどけたときに破損、スタックので、ESP/EBPはゴミのように設定されます。int x; memset(&x, 0, 10000000);

    とCOUNあなたのスタックサイズより大きな配列を宣言して使用することによりtless他の方法...

  • 1

    :実行時に

    $ ulimit -s 
    8192 
    $ 
    

    その後、

    int main(void) 
    { 
        volatile char bla[8192 * 1024 + 16] = {0}; 
    } 
    

    は、セグメンテーションフォールトする可能性があります。

    +0

    なぜvolatileと入力しますか?私の例では –

    +0

    は、コンパイラがプログラムのどこかで使われていないので、それを最適化するのを避けるためです。 'for'ループを使って' printf'を使ってすべての要素を出力すると、コンパイラはそれを最適化できないので、 'volatile'修飾子は必要ありません。 – ouah

    関連する問題