バッファオーバーフローを理解しようとしています。以下のように、単純なコードを使用しています。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
{
char buffer[12];
strcpy(buffer,str);
return 1;
}
int main(int argc, char **argv)
{
char str[517];
FILE *badfile;
badfile = fopen("badfile", "r");
fread(str, sizeof(char), 517, badfile);
bof(str);
printf("Returned Properly\n");
return 1;
}
「badfile」にシェルコードを挿入する必要があることを理解しています。次のようなbadfileを作成するとします。
char buffer[517];
FILE *badfile;
memset(&buffer, 0x90, 517);
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
Buffer []の12番目のインデックスに挿入しますか?私はその問題に直面しています。しかし、それはリターンポジションではないためだと思います。戻り位置を計算する必要がありますか?ありがとう。
いいえ、違います。
注意すべき点が2つあります。
差出人住所を上書きしています。ファイルのどのバイトが戻りアドレスを上書きしてしまうかを理解する必要があります。たとえば、ファイルのバイト20〜23であるとします。
シェルコードの場所。シェルコードをファイルの後半に配置する必要があります(たとえば、末尾近くに)。次に、シェルコードがメモリに読み込まれるアドレスを予測する必要があります。 [〜#〜] a [〜#〜]がシェルコードがメモリにロードされるアドレスであるとします。これはリターンアドレスを上書きするために使用する必要があるため、このアドレスを知る必要があります。
これらの両方を知ったら、あなたは行ってもいいです。値[〜#〜] a [〜#〜]をファイルのバイト20〜23に格納し、シェルコードを後でファイルに格納します。あなたがそれを置くことにした場所。
これら2つのことを解決するには、スタックレイアウトを確認する必要があります。
まず、スタック上でstr
の先頭が表示される場所と戻りアドレスが表示される場所の間のオフセットを見つけます。このオフセットは、ファイル内のどのバイトが最終的に戻りアドレスを上書きするかを示します。このオフセットがたとえば20バイトである場合、ファイルのバイト20〜23が戻りアドレスに書き込まれます。攻撃を機能させるには、20バイトのファイルに、プログラムのジャンプ先となる値(シェルコードの開始アドレス)を入れる必要があります。この値は、戻りアドレスを上書きします。そこに置く値は、上記のアドレス[〜#〜] a [〜#〜]です。
次に、シェルコードをファイルのさらに後ろに置き、ファイルがメモリに読み込まれたときにシェルコードがメモリに格納されるアドレスを予測し、その開始アドレスを値として使用して戻りアドレスを上書きします。
Aleph Oneの Smashing the Stack For Fun And Profit を読むことをお勧めします。スタックを破壊するバッファオーバーランエクスプロイトの実行方法を学習するための優れたチュートリアルがあります。 (ヒント:最新のシステムでは、エクスプロイトが機能するように、まず手動でASLRとDEPを無効にしてください。)
それは間違いなくバニラバッファオーバーフローです。ただし、スタック上の戻りポインタが格納されている場所の正確なオフセットを見つける必要もあります。 (ヒント:間違いなく12バイトではありません。保存されている保存済みEBPを検討してください)。そのとおりです。badfileに挿入するシェルコードの戻りアドレスも計算する必要があります。ただし、ここではバッファが12バイトしかないため、そのスペースに12バイトのシェルコードを挿入するのは難しいと思います。探してみてください。ただし、mainのbufは517バイトなので、シェルコードをスタックの後半に配置できます。これは、ファイルの上位12バイトがジャンクである可能性があることを意味します。
ヒント: http://www.securitytube.net/groups?operation=view&groupId=4
上記のビデオチュートリアルをバッファオーバーフローのバッファオーバーフローの聖書として扱う
GDBを使用して、コードをトレースし、スタックポインター(スタック自体)を監視します。
バッファーが小さすぎて、シェルコード+戻りアドレスに適合しません。コンセプトをテストする場合は、少し大きくしてください。また、シェルコードをENVに配置することもできます。