2

私はスタックでコードを実行するこの例を見ていました:

#include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  char shellcode[] = “\xeb\xfe”;
  int main(int argc, char *argv[]){
          void (*f)();
          char x[4];
          memcpy(x, shellcode, sizeof(shellcode));
          f = (void (*)()) x;
          f();
}

これにより、セグメンテーション違反が発生します。私の理解では、xのサイズは4バイトしかないため、シェルコードは残りのバイトのメモリを使い果たします。そして、これにより、スタックメモリにコピーする書き込み操作が作成され、セグメントが発生します。スタックメモリが読み取り専用であるため、障害が発生します。私の理解は正しいですか?

4

1 に答える 1

2

正確には、これを実行しているOSは何ですか?

Mac Hacker's Handbookから引用するには:

Leopardは、スタック以外のメモリのどの部分にもXDビットを設定しません。これがバグなのか、見落としなのか、意図的なものなのかは不明ですが 、ソフトウェアのメモリ権限が実行不可に設定されていても、スタック以外の場所で実行できます。次の簡単なプログラムは、その点を示しています。

[あなたのスニペットは続きます]

(エンファシスマイン。)

アクセス許可が実行不可に設定されている場合(またはアクセス許可が完全に省略されている場合)、コードはセグメンテーションフォールトする必要があります。それは、作者でさえ質問するLeopardにはありませんでした。観察したのは、最新のOSの完全に正常な動作です。

追加します:デバッガーを介して実行してみてください。\xeb\xfeは無限ループですが、技術的には一度もループしないでください。OSは手首を叩くはずです(これは明らかにここで起こっています)。

于 2012-02-05T00:26:43.850 に答える