スタック バッファ オーバーフローを研究していて、考えさせられるものを見ました。まず、オペレーティング システムは、カーネル2.6.20でASLR が無効になっているDamn Vulnerable Linuxです。
実際のところ、C プログラム内で exec 関数を呼び出すと、ヒープとスタックのメモリがゼロになり、失われることがわかっていました。しかし、ヒープにバッファーを割り当て (malloc)、そのバッファーへのポインターを exec 関数で実行されるプログラムに引数として渡すと、バッファー内 (ヒープ内) のデータがスタックに保存されます。したがって、exec の最後に、スタックに (以前はヒープにあった) バッファーがあります。わかりやすくするために、次の例を示します。
Program: bingo
#include <stdlib.h>
int main(int argc,char* argv[]){
int i;
char *buffer=malloc(600);
for (i=0;i<600;i++){
buffer[i]='A';
}
buffer[600-1]=0;
execl("./test","test",buffer,0);
free(buffer);
return 0;
}
そしてテストは簡単なプログラムになります。
Program: test
#include <stdlib.h>
int main(int argc,char* argv[]){
printf("Hello world\n");
return 0;
}
ここで、GDB を使用してビンゴ プログラムをデバッグすると、ヒープに置かれたバッファーの内容 (すべての As) が、execl 関数の実行中に実際にスタックにコピーされることがわかります。したがって、プログラムの実行の最後にヒープはゼロになりますが、バッファの内容は完全にスタックにコピーされます。私の説明は、このようにしてバッファの内容が実行されたプログラム(テスト)で利用できるようになるため、これが起こるということです。この動作が正常かどうかを知りたいだけです。私の疑問は、execl関数を呼び出すときに、実際に実行されたプログラム(テスト)への引数としてポインターを渡すことでした。バッファはポインタだからです。だから私の(おそらくばかげた)質問は、ポインタだけが実行されたプログラムに渡されるべきではなく、ポインタが指すコンテンツも渡されるべきではないのですか?
ありがとうございました