みなさん、良い一日を!
バッファオーバーフローがどのように機能するかを理解しようとしています。現在、バッファオーバーフロー攻撃を実行するために変更することになっている関数のリターンアドレスのアドレスを決定しているところです。私はインターネットで読んだ例に基づいて簡単なプログラムを書きました。このプログラムが行うことは、関数の戻りアドレスのアドレスをスタックに格納するための整数ポインターを作成することです。これを行うには(関数/プログラム変数がスタック内でどのように編成されるかを理解していることを認めます)、バッファー変数のアドレスに8を追加し、それをretの値として設定します。ここでは、funcの差出人住所の場所に含まれる住所を変更するようなことは何もしていません。
更新:プログラムを少し変更したので、funcのパラメーターaのスタックアドレスを出力します。ご覧のとおり、aとバッファの間の距離は約8バイトです。つまり、スタックレイアウトに基づいて、保存されたFPと古いEIP(func return address)が間にあることを意味します。私は正しいですか?
プログラムは次のとおりです。
void func( int a){
char buffer[3];
int *ret;
ret = buffer + 11; // this is the configuratio which made the whole program works... This now points to the address containing func's return address
printf (" address of a is %d\n", &a);
printf ("address of buffer is %x\n", buffer);
printf ("address of ret is %x\n", ret);
printf ("value of ret is %x\n", (*ret));
}
void main(){
int num;
num = 0;
func(num);
num = 1;
printf("Num now is %d", num);
}
実行されたときのプログラムの出力:
代替テキストhttp://img20.imageshack.us/img20/2034/72783404.png
ご覧のとおり、変数bufferとretのアドレスを出力しています。ret変数の値を出力するステートメントを追加しました(funcのリターンアドレスの場所を想定しているため、funcが実行から戻った後に実行される次の命令のアドレスを出力する必要があります)。
これは、funcが戻った後に実行される命令の想定アドレスを示すダンプです。(緑色の下線付き)ご覧のとおり、その値は、変数retに含まれている印刷された値とは大きく異なります。
代替テキストhttp://img717.imageshack.us/img717/8273/assemblycodecopy.png
私の質問は、なぜそれらが違うのかということです。(もちろん、私がしたことはすべて正しいと仮定して)。そうでなければ、私は何を間違えましたか?プログラムのランタイムスタックについての私の理解は間違っていますか?これを理解するのを手伝ってください。私のプロジェクトは来週の予定で、まだほとんど触れていません。要求があったらごめんなさい、あなたの助けがひどく必要です。