execle() также указывает среду. Что это обозначает?

Я читаю книгу под названием «Взлом: искусство эксплуатации» и наткнулся на этот абзац:

С execl() используется существующая среда, но если вы используете execle(), можно указать всю среду. Если массив окружения представляет собой просто шелл-код в качестве первой строки (с указателем NULL для завершения списка), единственной переменной окружения будет шелл-код. Это позволяет легко вычислить его адрес. В Linux адрес будет 0xbffffffa минус длина шеллкода в окружении минус длина имени исполняемой программы. Поскольку этот адрес будет точным, нет необходимости в следе NOP.

  1. Что они подразумевают под определением среды?

  2. Что классифицирует различные среды?

  3. Почему адрес переменной среды вычисляется таким образом (или, точнее, почему базовый адрес равен 0xbffffffa)?

  4. Если бы я использовал функцию execl() вместо execle(), мог бы я не использовать переменную окружения шеллкода?


person Shookie    schedule 31.05.2013    source источник


Ответы (2)


Что они подразумевают под определением среды?

Последний аргумент, переданный в execle(), представляет собой массив указателей на символы, которые содержат строки C, описывающие переменные среды, которые будет видеть исполняемая программа. Вот пример.

Что классифицирует различные среды?

Я не совсем понимаю это. Каждая программа имеет свой собственный набор переменных окружения, вот и все.

Почему адрес переменной среды вычисляется таким образом (или, точнее, почему базовый адрес равен 0xbffffffa)?

Потому что ядро ​​Linux реализовано именно так.

Если бы я использовал функцию execl() вместо execle(), мог бы я не использовать переменную окружения шеллкода?

execl() не позволяет указывать переменные среды, если это то, что вас интересует.

person Community    schedule 31.05.2013
comment
Я думал, что переменные окружения — это системные переменные, которые можно увидеть, набрав env в терминале. Так зачем мне создавать этот массив? Я знаю, что существует функция getenv(), которая возвращает адрес переменной окружения. Так для чего это? - person Shookie; 01.06.2013
comment
@Shookie Я думал, что переменные среды — это системные переменные, которые можно увидеть, набрав env в терминале. - они есть. Так зачем мне создавать этот массив? - Вам не нужно. И это не имеет никакого отношения к getenv(). Эта функция устанавливает переменные среды. - person ; 01.06.2013

 int execle(const char *path, const char *arg0, ...
         /* const char *argn, (char *)0,char *const envp[]*/);

Массив envp[] является указателем на все переменные среды UNIX для создаваемого процесса. Это определяет «среду» для нового процесса.

person jim mcnamara    schedule 31.05.2013