我正在使用一个父进程,它使用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);
}
答案 0 :(得分:1)
execve()不会创建Child进程。它只是取代了现有的流程。此外,execve()永远不会返回。 fork()是创建子进程的系统调用。如果execve()成功,则永远不会执行execve()之后的free(buffer)调用。