Чому розташування змінних середовищ сильно відрізняється?


9

Читаючи книгу Злом: мистецтво експлуатації Джоном Еріксоном, я намагаюся наблизити адресу змінної середовища 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Керівництво каже вона повертає покажчик на рядок , що містить значення змінної. Все інше не визначено, тому ваше ядро ​​та / або компілятор може зберігати значення там, де вони хочуть, доки ця обіцянка покажчика залишається істинною. Я здогадуюсь, що точна відповідь на це може бути важкою майстерністю і залежати від різних деталей реалізації карти пам'яті та фази Місяця. (Я недостатньо чарівник, щоб дати точну відповідь.)
Анко

"Я розумію, що якщо ім'я програми буде змінено або будуть додані нові змінні середовища, положення буде дещо іншим, але чому розташування так сильно відрізняється?" Це правда в найпростіших з усіх можливих реалізацій, але це, звичайно, не потрібно.
dmckee --- кошеня колишнього модератора

Відповіді:


13

Те, що ви описуєте, - це функція проти експлуатації, яка називається рандомізацією макетів простору адреси (ASLR). В основному ядро ​​ставить саму верхню адресу стека виклику функції програми за дещо іншою ("випадковою") адресою кожен раз, коли ядро ​​завантажує файл ELF програми з диска. Адреси argvта змінні середовища, серед яких ваш код оболонки, вказують на різну адресу при кожному виклику програми.

ASLR, як передбачається, ускладнить використання переповнення буфера та інших уразливостей, пов'язаних зі стеком. Експлуатувач повинен написати код або зробити щось, щоб врахувати різні адреси змінних і значень у стеку виклику функції.

Схоже, ви можете відключити ASLR, зробивши щось на кшталт:

echo 0 > /proc/sys/kernel/randomize_va_space

як користувач root. Оскільки ви явно цитуєте Ubuntu, наведена вище команда відрізняється:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

Так, це зробило трюк. Я помітив, що автор книги використовує Ubuntu 10.04, який ще не мав ASLR.
Янман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.