天天看點

Linux x86_64下程序位址空間布局

關于linux 32位記憶體下的記憶體空間布局,可以參考這篇博文linux下c程式程序位址空間局關于源代碼中各種資料類型/代碼在elf格式檔案以及程序空間中所處的段,在x86_64下和i386下是類似的,本文主要關注vm.legacy_va_layout以及kernel.randomize_va_space參數影響下的程序空間記憶體宏觀布局。

vm_legacy_va_layout=1

kernel.randomize_va_space=0

此種情況下采用傳統記憶體布局方式,不開啟随機化

cat 程式的記憶體布局

Linux x86_64下程式位址空間布局

可以看出:

代碼段:0x400000–>

資料段

堆:向上增長 2aaaaaaab000–>

棧:7ffffffde000<–7ffffffff000

系統調用:ffffffffff600000-ffffffffff601000

你可以試一下其他程式,在kernel.randomize_va_space=0時堆起點是不變的

vm_legacy_va_layout=0

現在預設記憶體布局,不随機化

Linux x86_64下程式位址空間布局

堆:向下增長 <–7ffff7fff000

kernel.randomize_va_space=2 //ubuntu 14.04預設值

使用現在預設布局,随機化

Linux x86_64下程式位址空間布局
Linux x86_64下程式位址空間布局

對比兩次啟動的cat程式,其記憶體布局堆的起點是變化的,這從一定程度上防止了緩沖區溢出攻擊。

與情形三類似,不再贅述

繼續閱讀