多くのポインタを使用するバイナリをデバッグしようとしています。エラーを理解するために出力をすばやく確認するために、オブジェクトのアドレスとそれに対応する値を出力する場合がありますが、オブジェクトのアドレスはランダム化されているため、このクイックチェックの目的に反しています。これを一時的または永続的に無効にして、プログラムを実行するたびに同じ値を取得する方法はありますか?.
おっとっと。 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
これは、UNIX exec
の前にCソースからプログラムで行うこともできます。
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
私のCentOS 6 64ビットシステムでは、関数(おそらく上記の同じsyscallを呼び出す)を使用しているようです。 /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.
}
現在のプロセスでアドレスのランダム化をオフにできないことは明らかであるため(ニヤリ:おそらく動的ロードでない限り)、これは後でフォークとexecにのみ影響します。アドレスランダム化フラグは子サブプロセスに継承されていると思いますか?
とにかく、Cソースコードでアドレスのランダム化をプログラムでオフにする方法は、これです。これは、ユーザーに手動で介入させ、setarchまたは前述のその他のソリューションの1つで起動することを強制したくない場合の唯一のソリューションである可能性があります。
これをオフにする際のセキュリティ問題について不平を言う前に、一部の共有メモリライブラリ/ツール( PickingTools共有メモリ および一部の IBMデータベース など)はランダム化をオフにできる必要がありますメモリアドレスの。