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