Linuxカーネル2.6.12からスタックの開始アドレスをランダム化させる
スタック保護機能がデフォルト設定されました。
僕の環境で、
$uname -r
とすると、下記のカーネルバージョンを得ました。
$3.2.0-24-generic-pae
ついで、
/proc/sys/kernel/randomize_va_space
の中身をみると、2とあります。これは、スタック保護機能がONであることの証拠です。
ただ、glibcのシンボル __libc_stack_endを参照することで、スタック開始アドレスを
ゲット出来ちゃったりします。
今回は、この値を参照することで、実行する度に、スタック開始アドレスが変わっていく
様子を見ていきます。
getting stack address area address
#include <unistd.h>
#include <stdint.h>
#pragma weak __libc_stack_end
extern void* __libc_stack_end;
void* get_linux_stack_base(){
long pgsize = sysconf(_SC_PAGESIZE);
return (void*)(((uintptr_t)__libc_stack_end + pgsize) & ~(pgsize -1));
}
void main(){
printf("find out my stack area address\n");
void *stckaddrss = get_linux_stack_base();
printf("my stack area address is %p\n", stckaddrss);
}
実行結果
my stack area address is 0xbfa19000
my stack area address is 0xbff47000
my stack area address is 0xbffb8000
my stack area address is 0xbfa89000
my stack area address is 0xbff9d000
my stack area address is 0xbf80e000
my stack area address is 0xbfd6e000
my stack area address is 0xbfe34000
my stack area address is 0xbfd43000
まっ、こんな感じで実行するたびに、スタック開始アドレスが変化するようすが見えました。