我正在使用一个父进程,它使用 execve() 来运行具有我在父进程中定义的特定环境变量的子进程。在父进程中,如果我查看内存位置 $esp + 0x240 我会找到所有环境变量。但是,一旦启动子进程,我就无法找到存储预定义环境变量的内存地址。
我会认为由于 execve() 用子进程替换父进程,传递给子进程的环境变量将位于 0xbffffffa 减去环境变量字符串的长度(在 Linux 中)。但是,当启动子进程时,我不再可以访问内存中的那个位置。父进程调用execve()前的esp为0xbffff120,子进程启动后esp跳转到0xbf9835a0。(我猜这是因为子进程具有父进程没有的root权限)现在当我从堆栈顶部查看内存直到我不再可以访问内存时,没有对从父进程传递的任何环境变量进行签名。他们将位于哪里?同样在更一般的说明中,
#include <stdio.h>
#include <stdlio.h>
#include <string.h>
#include <unistd.h>
char envvari[]=
"\x31\xc0\ ...." // Can be any environment variable
int main(int argc, char *argv[]) {
char *env[2] = {envvari, 0};
unsigned int i, ret;
char *buffer = (char *) malloc(160);
char *args[] = {"notesearch", buffer, 0};
ret = 0xbffffffa - (sizeof(envvari)-1) - strlen("./notesearch");
for(i=0; i < 160; i+=4)
*((unsigned int *)(buffer+i)) = ret;
execve("./notesearch", args, env);
free(buffer);
}