Почему расположение переменных Enviroment сильно отличается?

Чтение книги «Взлом: искусство эксплуатации» Джона Эриксона, я пытаюсь аппроксимировать адрес переменной среды 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 

Я понимаю, что если имя программы будет изменено или будут добавлены новые переменные среды, позиция будет немного отличаться, но почему местоположение сильно отличается?

  • Как запустить Steam с рабочего стола Xfce?
  • Что указывает период, когда переменная окружения задана как «VARIABLE_NAME =.»
  • Перепутал файл bash.bashrc, команды больше не работают
  • Значение переменной не распознается после использования gnu parallel?
  • Как обновить фон рабочего стола в различных средах рабочего стола?
  • Какая среда рабочего стола даст мне панель пользовательского интерфейса?
  • Может ли сценарий bash сбросить и дезинфицировать * всю * среду и как?
  • проверьте «ошибки» или «ORA-»
  • One Solution collect form web for “Почему расположение переменных Enviroment сильно отличается?”

    То, что вы описываете, – это функция анти-эксплуатации, называемая рандомизацией макета пространства адресов (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 
    Linux и Unix - лучшая ОС в мире.