Переменные среды, использующие execve() для запуска дочернего процесса

Я использую родительский процесс, который использует 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);
}

person Benjamin R C Bell    schedule 21.06.2013    source источник
comment
Пожалуйста, вместо описания кода гораздо лучше показать код.   -  person Some programmer dude    schedule 21.06.2013
comment
Вы не получите полезного ответа без некоторого кода. +1 @Иоахим Пилеборг   -  person jim mcnamara    schedule 21.06.2013
comment
некоторые из вас могли видеть пример этого кода в книге Джона Эриксона «Искусство эксплуатации».   -  person Benjamin R C Bell    schedule 21.06.2013
comment
@Benjamin: Извините, предыдущий ответ не был хорошо продуман ... Я удалил его. Я думаю, эта страница может помочь... stackoverflow.com/questions/3693335/   -  person Jimbo    schedule 21.06.2013
comment
Кроме того, это хорошее чтение - www-h. eng.cam.ac.uk/help/tpl/unix/fork.html — я не думаю, что у вас есть доступ к envvari, так как execve завершит ваш текущий процесс, включая все ресурсы (кроме некоторых fds).   -  person Jimbo    schedule 21.06.2013


Ответы (1)


execve() не создает дочерний процесс. Он просто заменяет существующий процесс. Кроме того, execve() никогда не возвращается. fork() — это системный вызов, который создает дочерний процесс. вызов free(buffer) после execve() никогда не будет выполнен, если execve() успешно.

person sukumarst    schedule 22.06.2013