Я использую 32-разрядную версию Ubuntu 12.04, для некоторого эксперимента мне нужно отключить ASLR; как мне это сделать? Что я должен сделать после этого, чтобы снова включить ASLR?
Согласно статье Насколько эффективен 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
следует навсегда отключить это.
То /proc/sys/kernel/randomize_va_space
интерфейс управляет ASLR в масштабах всей системы.
Если вы не хотите общесистемных изменений, используйте ADDR_NO_RANDOMIZE
личность установите флажок для временного отключения ASLR. Управление этим флагом может быть выполнено с помощью setarch
и его -R
вариант, такой как
setarch `uname -m` -R /bin/bash
Это откроет для вас новую оболочку Bash с отключенным ASLR, включая все дочерние процессы, запускаемые из этой оболочки. Просто exit
оболочку, как только вы закончите.
Кстати, на i386, ulimit -s unlimited
может эффективно "отключить" ASLR.
РЕДАКТИРОВАТЬ (апрель 2016): The ulimit -s unlimited
был зафиксирован и назначен CVE-2016-3672.
Более постоянные способы отключения ASLR должны храниться в виртуальной машине по очевидным причинам.
чтобы проверить возможность перезаписи обратных адресов стековых фреймов и т. Д., вам нужно будет скомпилировать без канареек стека -fno-stack-protector
, в то время как для того, чтобы позволить вам выполнять код в стеке, вам необходимо скомпилировать с -z execstack
, делая
$ gcc -fno-stack-protector -z execstack -o <my_program> my_code.c
Вы можете использовать следующую команду, чтобы временно отключить ASLR.
sudo sysctl kernel.randomize_va_space=0
Если вы хотите создать программу, которая отключает ASLR для себя при запуске, вы можете использовать personality
системный вызов в Linux. Вот рецепт:
#include <stdio.h>#include <sys/personality.h>int main(int argc, char **argv) { const int old_personality = personality(ADDR_NO_RANDOMIZE); if (!(old_personality & ADDR_NO_RANDOMIZE)) { const int new_personality = personality(ADDR_NO_RANDOMIZE); if (new_personality & ADDR_NO_RANDOMIZE) { execv(argv[0], argv); } } printf("&argc == %p\n", (void *) &argc);}
Если вы посмотрите на источник для setarch
, это вызывает personality
дважды примерно по такой схеме. Главное отличие заключается в том, что setarch
звонки exec
в какой-то другой программе, в то время как мой рецепт exec
сам по себе. Важно, чтобы вы использовали ненулевое значение & ADDR_NO_RANDOMIZE
и не тесты на равенство: иначе вы можете перейти в бесконечное exec
цикл, если вы, например, компилируете с -z execstack
.
Смотрите также справочная страница для personality
.