我正在研究堆栈缓冲区溢出,我看到了一些让我思考的东西。首先操作系统是内核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 函数时,我实际上将指针作为参数传递给执行的程序(测试)。因为缓冲区是一个指针。所以我的(可能是愚蠢的)问题是:不应该只将指针传递给执行的程序,而不是指针指向的内容?
谢谢