Ответ 1
В Ubuntu его можно отключить с помощью...
echo 0 > /proc/sys/kernel/randomize_va_space
В Windows этот пост может быть полезен...
http://blog.didierstevens.com/2007/11/20/quickpost-another-funny-vista-trick-with-aslr/
Я пытаюсь отлаживать двоичный файл, который использует много указателей. Иногда, чтобы быстро увидеть результат, чтобы выяснить ошибки, я распечатываю адрес объектов и их соответствующие значения, однако адреса объектов рандомизированы, и это побеждает цель этой быстрой проверки. Есть ли способ отключить это временно/постоянно, чтобы я получал одинаковые значения каждый раз, когда запускаю программу.
К сожалению. OS Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux
В 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 похоже, что она использует функцию (которая, вероятно, вызывает самосогласованный 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) должны быть в состоянии отключить рандомизацию адресов памяти.