8

最新のコンパイラGCCは非常に強力であるため、コンパイルフェーズでのバッファオーバーフローを防ぐこともできるため、OSはスタックスペースでコードを実行できません。

例えば:

void function(char *str) 
{
   char buffer[16];

   strncpy(buffer, str, 256);
}

void main() 
{
  char large_string[256];
  int i;

  for( i = 0; i < 256; i++)
    large_string[i] = 'A';

  function(large_string);
}

魔法の0x41414141を取得できる唯一の方法は、次のようなGCCコンパイルパラメータを設定することです。

gcc -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow

(ubuntu 10.04 x86 lucid 32ビットボックスでテストしました)

GCCスタックスマッシング保護をバイパスする方法はありますか?

4

2 に答える 2

7

コンパイルするときは、スタック保護を無効にする必要があります。

gcc  -fno-stack-protector -z execstack stackoverflow.c -o stackoverflow

また、アドレス空間配置のランダム化(ASLR)を無効にすることもできます。

sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

これで、バッファオーバーフローを試すことができます。楽しみと利益のために、スタックのスマッシングを読むことをお勧めします。

編集:

コメントで述べたように、スタック保護を無効にすることは割り当てで許容できると考えるのが安全ですが、スタック保護をバイパスする場合は、次のようなカナリアに関連する質問についてSOFを確認する必要があります。

SSP(StackSmashing Protection)/ Propoliceをバイパスする方法はありますか?

于 2012-10-23T07:10:03.450 に答える
1

あなたの例では簡単ではありませんが、スタックスマッシング保護(スタックカナリアと呼ばれる)を回避する方法は確かにあります。スタックカナリアの弱点のいくつかについては、ここで私の答えを参照してください。

于 2012-10-23T07:22:56.963 に答える