2013-05-31 3 views
2

Я читаю книгу под названием «Hacking: искусство эксплуатации», и я наткнулся на этот пункт:execle() также определяет среду. Что это значит?

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

  1. Что они означают, указав на окружающую среду?

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

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

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

ответ

2

Что они означают, указав на окружающую среду?

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

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

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

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

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

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

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

+0

Я думал, что переменная среды была системными переменными, которые вы могли видеть, введя «env» в терминале. Итак, зачем мне создавать этот массив? Я знаю, что существует функция «getenv()», которая вернет адрес переменной окружения. Так для чего это? – Shookie

+0

@Shookie «Я думал, что переменная среды - это системные переменные, которые вы можете увидеть, набрав« env »в терминале». - они есть. «Так зачем мне создавать этот массив?» - вам не нужно. И это не имеет никакого отношения к 'getenv()'. Эта функция ** устанавливает ** переменные среды. –

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

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