關于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 程式的記憶體布局
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyYzMwUDO1IjM4AzMwUTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
可以看出:
代碼段:0x400000–>
資料段
堆:向上增長 2aaaaaaab000–>
棧:7ffffffde000<–7ffffffff000
系統調用:ffffffffff600000-ffffffffff601000
你可以試一下其他程式,在kernel.randomize_va_space=0時堆起點是不變的
vm_legacy_va_layout=0
現在預設記憶體布局,不随機化
堆:向下增長 <–7ffff7fff000
kernel.randomize_va_space=2 //ubuntu 14.04預設值
使用現在預設布局,随機化
對比兩次啟動的cat程式,其記憶體布局堆的起點是變化的,這從一定程度上防止了緩沖區溢出攻擊。
與情形三類似,不再贅述