关于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 程序的内存布局
可以看出:
代码段:0x400000–>
数据段
堆:向上增长 2aaaaaaab000–>
栈:7ffffffde000<–7ffffffff000
系统调用:ffffffffff600000-ffffffffff601000
你可以试一下其他程序,在kernel.randomize_va_space=0时堆起点是不变的
情形二:
- vm_legacy_va_layout=0
- kernel.randomize_va_space=0
现在默认内存布局,不随机化
可以看出:
代码段:0x400000–>
数据段
堆:向下增长 <–7ffff7fff000
栈:7ffffffde000<–7ffffffff000
系统调用:ffffffffff600000-ffffffffff601000
情形三:
- vm_legacy_va_layout=0
- kernel.randomize_va_space=2 //ubuntu 14.04默认值
使用现在默认布局,随机化
对比两次启动的cat程序,其内存布局堆的起点是变化的,这从一定程度上防止了缓冲区溢出攻击。
情形四:
- vm_legacy_va_layout=1
- kernel.randomize_va_space=2 //ubuntu 14.04默认值
与情形三类似,不再赘述