Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 2

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

setarch `uname -m` -R ./yourProgram

Ответ 3

Вы также можете сделать это программно из источника 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 похоже, что она использует функцию (которая, вероятно, вызывает самосогласованный syscall выше). Взгляните на этот фрагмент из include файла в /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.
}

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

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

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