Вы также можете сделать это программно из источника 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
(в исходном коде setarch указан как <sys/personality.h>
):
/* 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.
}
Совершенно очевидно, что вы не можете отключить рандомизацию адресов в процессе, в котором вы находитесь(ухмыляется: если не может быть динамическая загрузка), так что это влияет только на вилки и execs позже.Я полагаю, что флаги рандомизации адресов наследуются дочерними подпроцессами?
В любом случае, именно так вы можете программно отключить рандомизацию адресов в исходном коде C.Это может быть вашим единственным решением, если вы не хотите, чтобы пользователь вмешивался вручную и запускался с помощью setarch или одного из других решений, перечисленных ранее.
Прежде чем жаловаться на проблемы безопасности при отключении этого параметра.некоторые библиотеки / инструменты общей памяти (такие как общая память PickingTools и некоторые базы данных IBM ) должны иметь возможность отключать рандомизацию адресов памяти.