実験コードを書きますね。
スタックの先頭アドレスを取得します。
C++
1#include <stdio.h> 2#include <unistd.h> 3 4extern void* __libc_stack_end; 5 6void* get_linux_stack_base() 7{ 8 unsigned long long pagesize = sysconf(_SC_PAGESIZE); 9 return (void*)(((unsigned long long)__libc_stack_end + pagesize) & ~ (pagesize - 1)); 10} 11 12int main() 13{ 14 int t; 15 scanf("%d", &t); 16 printf("end:%p, base:%p\n", __libc_stack_end, get_linux_stack_base()); 17} 18
C++でコンパイルしていますが、おそらくCでも大丈夫だと思います。
scanf()はなくても良いです。待機させるためにあります。
結果は、、、
__libc_stack_end = 0x7fffffffd630
0x7fffffffe000 となりました。
ところが、/proc/PID/mapsを覗くと・・・
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0 7ffffffdd000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
となっています。(左側がスタートアドレスです。)
どちらも開始アドレスが一致していません。
なぜでしょうか??
どちらかが間違っているんですかね??
ちょっと近い話が書いてある箇所を見つけました。
ダイナミンクリンカローダや共有ライブラリなどをreadelf -S で見ても上記のように固定のアドレスが設定されているわけではありません。
??
ではこのコマンド(readelfやproc)によって表示されているアドレスは何でしょうか??
ちなみに、「ALSR」は無効化しています。
これは・・・「ALSR」が有効の場合の話をしているんでしょうか??
環境はLinux 64bit GCC です!
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/25 12:56