【发布时间】:2013-06-21 11:55:10
【问题描述】:
我正在使用一个父进程,它使用 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);
}
【问题讨论】:
-
拜托,与其描述代码,不如实际显示代码。
-
如果没有一些代码,您将不会得到有用的答案。 +1 @Joachim Pileborg
-
你们中的一些人可能已经在 Jon Erickson 的《剥削的艺术》一书中看到了这段代码的示例。
-
@Benjamin:抱歉,上一个答案没有得到很好的考虑......我已经删除了它。我认为这个页面可能会有所帮助...stackoverflow.com/questions/3693335/…
-
另外,这是一本好书 - www-h.eng.cam.ac.uk/help/tpl/unix/fork.html - 我认为您无权访问
envvari,因为execve将结束您当前的进程,包括所有资源(某些 fd 除外)。