1

基本的なバッファ オーバーフロー プロジェクトに取り組んでいます。目標は、バッファをオーバーフローさせてシェルを実行することです。私が悪用しているコードは次のようになります。

int func(char *str)
{
    //4 bytes for str, 16 bytes for the buffer, 4 for the ebp, 4 for the ret
    char buffer[12];

    /* The following statement has a buffer overflow problem */ 
    strcpy(buffer, str);

    return 1;
}

基本的に、シェルを開始するシェルコードのアドレスで func() の戻りアドレスを上書きするように str を作成しています。

コードを gcc -g オプションでコンパイルし、実行可能ファイルを gdb で実行すると、すべて正常に動作します。ただし、-g を省略すると、シェルの代わりに segfault が発生します。

私が物事を正しく理解していれば、これは gdb がスタックに何かを追加することが原因である可能性が最も高いです。これは、func の戻りアドレスを置き換えるために使用する値を変更する必要があることを意味します。この新しいアドレスを見つけるにはどうすればよいですか?

printf("%p", str); を追加しようとしました。func に変換し、-g を指定して、または指定せずにコンパイルして実行しますが、どちらの方法でも同じ結果が出力されます。私は他にもいくつかの同様のことを試しました。

4

1 に答える 1

1

解決策を見つけました。どうやら、スタックを変更するのは -g フラグではなく、gdb で実行すると変更されます。gdb で実行しているときに printf を使用し、プログラムを個別に実行すると、違いが現れ、それに応じてコードを調整できます。

于 2012-11-06T04:17:33.683 に答える