Я использую родительский процесс, который использует execve() для запуска дочернего процесса с определенными переменными среды, которые я определил в родительском процессе. В родительском процессе, если я смотрю на ячейку памяти $esp + 0x240, я нахожу все переменные среды. Однако после запуска дочернего процесса я не могу найти адрес памяти, где были сохранены предопределенные переменные среды.
Я бы подумал, что, поскольку execve() заменяет родительский процесс дочерним процессом, переменные среды, передаваемые дочернему процессу, будут расположены по адресу 0xbffffffa минус длина строки переменной среды (в Linux). Однако, когда запускается дочерний процесс, у меня больше нет доступа к этому месту в памяти. ESP родительского процесса перед вызовом execve() равен 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);
}
envvari
, так какexecve
завершит ваш текущий процесс, включая все ресурсы (кроме некоторых fds). - person Jimbo   schedule 21.06.2013