64位字长



- 任何虚拟地址高17位必须一致:
0000000000000000 - 00007fffffffffff(128TB)为用户空间
ffff800000000000 - ffffffffffffffff(128TB)为内核空间 - 查看进程的内存空间布局, 可以使用如下cmd(xxxx代表进程的pid)
$ cat /proc/xxxx/maps
- 或者使用如下cmd可以查看更详细的内容
$ cat /proc/xxxx/smaps
动态链接库也被映射到mmap区域
从上图可以看到,栈至顶向下扩展,并且栈是有界的。堆至底向上扩展, mmap 映射区域至顶向下扩展, mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,这种结构便于 C 运行时库使用 mmap 映射区域和堆进行内存分配。上图的布局形式是在内核 2.6.7 以后才引入的
可以看到,栈和 mmap 映射区域并不是从一个固定地址开始,并且每次的值都不一样,这是程序在启动时随机改变这些值的设置,使得使用缓冲区溢出进行攻击更加困难。当然也可以让程序的栈和 mmap 映射区域从一个固定位置开始,只需要设置全局变量 randomize_v a_space 值为 0 ,这个变量默认值为 1 。用户可以通过如下的任一方式来停用进程地址随机化
sudo sysctl -w kernel.randomize_va_space=0
该属性有3个取值:
0 : 表示关闭内存地址随机化
1 : 表示将mmap的基址,stack和vdso地址随机化
2 : 表示在1的基础上, heap地址随机化
参考:http://lishiwen4.github.io/linux/linux-process-memory-location
网友评论