Читаючи книгу Злом: мистецтво експлуатації Джоном Еріксоном, я намагаюся наблизити адресу змінної середовища SHELLCODE
для використання програми.
Кожен раз, коли я біжу, getenv("SHELLCODE");
щоб отримати місце, результат стає абсолютно іншим.
Витяг з моєї оболонки:
> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3
Я розумію, що якщо ім’я програми буде змінено або додані нові змінні середовища, положення буде дещо іншим, але чому розташування так сильно відрізняється?
getenv
Керівництво каже вона повертає покажчик на рядок , що містить значення змінної. Все інше не визначено, тому ваше ядро та / або компілятор може зберігати значення там, де вони хочуть, доки ця обіцянка покажчика залишається істинною. Я здогадуюсь, що точна відповідь на це може бути важкою майстерністю і залежати від різних деталей реалізації карти пам'яті та фази Місяця. (Я недостатньо чарівник, щоб дати точну відповідь.)