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

Я использую 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.

Только для себя: linux - Disable and re-enable address space layout randomization only for myself - Stack Overflow || linux - Disable Address space layout randomization (ASLR) for my processes - Unix & Linux Stack Exchange