UNIXの前にCソースからプログラムでこれを行うこともできますexec
。
setarchのソースを見ると(ここに1つのソースがあります):
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
私のCentOS664ビットシステムでは、関数を使用しているように見えます(おそらく上記の自己同一のシステムコールを呼び出します)。( setarchソースコードで/usr/include/sys/personality.h
参照さ れているように)インクルードファイルからこのスニペットを見てください。<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.
}
現在のプロセスでアドレスのランダム化をオフにできないことは明らかです(笑:動的ロードでない限り)。したがって、これは後でフォークとエグゼクティブにのみ影響します。アドレス配置のランダム化フラグは子サブプロセスに継承されると思いますか?
とにかく、それはあなたがプログラムでCソースコードのアドレスランダム化をオフにすることができる方法です。これは、ユーザーが手動で介入してsetarchまたは前述の他のソリューションのいずれかを起動するように強制したくない場合の唯一のソリューションである可能性があります。
これをオフにする際のセキュリティの問題について不満を言う前に、一部の共有メモリライブラリ/ツール(PickingTools共有メモリや一部のIBMデータベースなど)は、メモリアドレスのランダム化をオフにできる必要があります。