Отключить рандомизацию адресов памяти

Я пытаюсь отладить двоичный файл, который использует много указателей. Иногда для быстрого просмотра выходных данных с целью выявления ошибок я распечатываю адрес объектов и соответствующие им значения, однако адреса объектов случайным образом, и это не соответствует цели этой быстрой проверки. Есть ли способ отключить это временно / навсегда, чтобы я получал одинаковые значения при каждом запуске программы.

К сожалению. ОС есть Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

3 ответа

Решение

В Ubuntu его можно отключить с помощью...

echo 0 > /proc/sys/kernel/randomize_va_space

В Windows этот пост может быть полезен...

http://blog.didierstevens.com/2007/11/20/quickpost-another-funny-vista-trick-with-aslr/

Чтобы временно отключить ASLR для конкретной программы, вы всегда можете выполнить следующее (нет необходимости в sudo)

setarch `uname -m` -R ./yourProgram

Вы также можете сделать это программно из источника C до UNIX exec,

Если вы посмотрите на источники для setarch (вот один из источников):

http://code.metager.de/source/xref/linux/utils/util-linux/sys-utils/setarch.c

Вы можете увидеть, сводится ли к системному вызову (syscall) или вызов функции (в зависимости от того, что определяет ваша система). Из setarch.c:

#ifndef HAVE_PERSONALITY
# include <syscall.h>
# define personality(pers) ((long)syscall(SYS_personality, pers))
#endif

В моей 64-битной системе CentOS 6 похоже, что она использует функцию (которая, вероятно, вызывает тот же самый системный вызов выше). Взгляните на этот фрагмент из включаемого файла в /usr/include/sys/personality.h (упоминается как <sys/personality.h> в исходном коде setarch):

/* Set different ABIs (personalities).  */
extern int personality (unsigned long int __persona) __THROW;

Все сводится к тому, что из кода C вы можете вызвать и настроить личность на использование ADDR_NO_RANDOMIZE, а затем exec (как setarch делает).

#include <sys/personality.com>

#ifndef HAVE_PERSONALITY
# include <syscall.h>
# define personality(pers) ((long)syscall(SYS_personality, pers))
#endif

...

void mycode() 
{
   // If requested, turn off the address rand feature right before execing
   if (MyGlobalVar_Turn_Address_Randomization_Off) {
     personality(ADDR_NO_RANDOMIZE);
   } 
   execvp(argv[0], argv); // ... from set-arch.
}

Совершенно очевидно, что вы не можете отключить рандомизацию адресов в процессе, в котором находитесь (ухмылка: если не может быть динамическая загрузка), так что это влияет только на вилки и исполняемые файлы позже. Я полагаю, что флаги рандомизации адресов наследуются дочерними подпроцессами?

Во всяком случае, именно так вы можете программно отключить рандомизацию адресов в исходном коде C. Это может быть вашим единственным решением, если вы не хотите, чтобы пользователь вмешивался вручную и запускался с помощью setarch или одного из других решений, перечисленных ранее.

Прежде чем жаловаться на проблемы безопасности при отключении этой функции, некоторые библиотеки / инструменты общей памяти (например, общая память PickingTools и некоторые базы данных IBM) должны иметь возможность отключить рандомизацию адресов памяти.

Другие вопросы по тегам