Как временно отключить ASLR (рандомизация размещения адресного пространства)?

43

Я использую Ubuntu 12.04 32-бит сейчас для некоторого эксперимента. Мне нужно отключить ASLR, как я могу это сделать? и после этого, что я должен сделать, чтобы снова включить ASLR?

    
задан Am1rr3zA 10.07.2013 в 02:15
источник

4 ответа

56

Согласно статье Насколько эффективна ASLR для Linux-систем? , вы можете настроить ASLR в Linux с помощью интерфейса /proc/sys/kernel/randomize_va_space .

  

Поддерживаются следующие значения:

     
  • 0 - Без рандомизации. Все статично.
  •   
  • 1 - Консервативный   рандомизации. Общие библиотеки, стек, mmap() , VDSO и куча   рандомизированное.
  •   
  • 2 - Полная рандомизация. В дополнение к элементам, перечисленным в   предыдущая точка, память, управляемая через brk() , также рандомизирована.
  •   

Итак, чтобы отключить его, запустите

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

и снова включить его, запустите

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

Это не выдержит перезагрузки, поэтому вам придется настроить это в sysctl . Добавьте файл /etc/sysctl.d/01-disable-aslr.conf , содержащий:

kernel.randomize_va_space = 0

должен окончательно отключить это.

    
ответ дан gertvdijk 10.07.2013 в 13:17
источник
18

Интерфейс /proc/sys/kernel/randomize_va_space управляет ASLR в общесистемной области.

Если вы не хотите общесистемного изменения, используйте ADDR_NO_RANDOMIZE личность , чтобы временно отключить ASLR. Управление этим значком личности может быть выполнено с помощью setarch и его -R ( manpage ), добавив команду.

Мне очень удобно открывать совершенно новую оболочку, используя:

setarch 'uname -m' -R /bin/bash

Это откроет новую оболочку Bash для вас с отключенным ASLR, включая все дочерние процессы (программы, запущенные из этой оболочки).

Просто exit оболочки, как только вы закончите.

Кстати, на i386 ulimit -s unlimited может «отключить» ASLR.

EDIT (апрель 2016): ulimit -s unlimited было исправлено и присвоено CVE-2016-3672 .

    
ответ дан zhangyoufu 07.08.2014 в 07:53
1

Более постоянные способы отключения ASLR должны быть сохранены в виртуальной машине по очевидным причинам.

, чтобы проверить возможность перезаписывать обратные адреса фрейма стека и т. д., вам нужно будет скомпилировать без стека канарейки -fno-stack-protector , а для того, чтобы вы могли выполнить код в стеке, нужно компилировать с -z execstack , делая

$ gcc -fno-stack-protector -z execstack -o <my_program> my_code.c
    
ответ дан NewPerson 10.07.2013 в 03:33
1

Вы можете просто использовать sudo sysctl kernel.randomize_va_space=0 , чтобы temparaly отключить ASLR.

    
ответ дан lzutao 19.03.2017 в 20:19