41

多くのポインタを使用するバイナリをデバッグしようとしています。エラーをすばやく把握するために出力を確認するために、オブジェクトのアドレスとそれに対応する値を出力することがありますが、オブジェクトのアドレスはランダム化されているため、このクイックチェックの目的が損なわれます。プログラムを実行するたびに同じ値を取得できるように、これを一時的/永続的に無効にする方法はありますか?

おっと。OSはLinux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

4

3 に答える 3

49

Ubuntuでは、次のように無効にすることができます...

echo 0 > /proc/sys/kernel/randomize_va_space

Windowsでは、この投稿が役立つかもしれません...

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

于 2011-03-04T14:02:18.757 に答える
41

特定のプログラムのASLRを一時的に無効にするには、いつでも次を発行できます(sudoは不要)

setarch `uname -m` -R ./yourProgram
于 2013-02-14T05:06:56.443 に答える
8

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データベースなど)は、メモリアドレスのランダム化をオフにできる必要があります。

于 2015-05-21T22:26:19.667 に答える