说明

  • 学过编译原理可知,C语言程序中所有变量的内存地址编译后都是确定了的,但是在linux平台上实际使用时可以发现变量的内存地址并不是固定的,如下:
* 示例代码
#include <stdio.h>int main(){int a;printf("%p\n", &a);return 0;
}
* 运行结果
xxx@Lenovo-V110-15IKB:~/$ ./test
0x7ffdd2ec0124
xxx@Lenovo-V110-15IKB:~/$ ./test
0x7ffc577a9644
xxx@Lenovo-V110-15IKB:~/$ ./test
0x7fffef5827e4
xxx@Lenovo-V110-15IKB:~/$ ./test
0x7fff44595414
xxx@Lenovo-V110-15IKB:~/$ ./test
0x7fffe93e1964

理解

  • 程序都是在运行阶段分配内存,所有变量的逻辑地址都是在编译后就确定了,但都是相对的偏移地址,只不过全局变量是相对数据段的偏移,局部变量是相对程序栈顶的偏移。
  • 变量地址会发生变化是因为ASLR机制导致了内存段地址发生了变化。

ASLR

  • 地址空间布局随机化(ASLR)可以帮助克服某些类型的缓冲区溢出攻击,ASLR可以将基数,库,堆和堆栈放在进程地址空间中的任意随机位置,这使攻击程序很难预测下一条指令的内存地址。
  • ASLR内置在Linux内核中,并由参数控制 /proc/sys/kernel/randomize_va_space,该 randomize_va_space参数可以采用以下值:
0 : 禁用ASLR。如果使用norandmapsboot参数引导内核,则将应用此设置。
1 : 随机化堆栈,虚拟动态共享对象(VDSO)页面和共享内存区域的位置。数据段的基地址位于可执行代码段的结尾之后。
2 : 随机化堆栈,VDSO页,共享内存区域和数据段的位置。这是默认设置。
  • 设置
echo 0 > /proc/sys/kernel/randomize_va_space
* 注意:非root用户如下设置会报错
sudo echo 0 > /proc/sys/kernel/randomize_va_space
bash: /proc/sys/kernel/randomize_va_space: Permission denied
* 因为这样写系统会认为是sudo 命令重定向,而sudo命令不支持重定向,正确写法:
sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"
  • 关闭ASLR后,测试发现变量的地址就是固定的。

内存安全 - 地址空间布局随机化(ASLR)相关推荐

  1. linux内存布局和地址空间布局随机化(ASLR)下的可分配地址空间

    https://zsummer.github.io/2019/11/04/2019-11-04-aslr/ 地址空间布局随机化(ASLR) <mmap的随机化> <Meltdown( ...

  2. 关闭aslr oracle,地址空间布局随机化 (Address Space Layout Randomization, ASLR)

    地址空间布局随机化 (Address Space Layout Randomization, ASLR) ASLR 是 Oracle Solaris 系统的一种功能,利用此功能可以随机生成进程地址空间 ...

  3. 关于Windows上地址空间布局随机化防御机制的分析(下)

    将32位程序重新编译为64位程序,以使地址空间布局随机化更有效 尽管Windows的64位版本已经成为主流十多年了,但32位版本的使用者仍然很多.有些程序确实需要保持与第三方插件的兼容性,比如web浏 ...

  4. linux的地址随机化ASLR,[翻译]Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)...

    前提条件: 经典的基于堆栈的缓冲区溢出 虚拟机安装:Ubuntu 12.04(x86) 在以前的帖子中,我们看到了攻击者需要知道下面两样事情 堆栈地址(跳转到shellcode) libc基地址(成功 ...

  5. Linux开机启动过程(6):页表的初始化、避开保留的内存、地址随机化

    内核引导过程. Part 6. 简介 这是内核引导过程系列文章的第六部分.在前一部分,我们已经看到了内核引导过程的结尾,但是我们跳过了一些高级部分. 你可能还记得,Linux内核的入口点是 main. ...

  6. Linux内核地址空间布局详解

    1. 简介 虽然x86_64的物理地址范围为64bit,但是因为地址空间太大目前不可能完全用完,当前支持57bit和48bit两种虚拟地址模式. 地址模式 单个空间 用户地址空间 内核地址空间 32位 ...

  7. Linux mem 2.2 内核地址空间布局详解

    文章目录 1. 简介 2. 内核页表初始化 2.0 decompress阶段 2.1 `head_64.S`和`head64.c` 2.2 start_kernel() 2.2.1 物理内存(e820 ...

  8. Linux下x86_64进程地址空间布局

    在x86_64下和i386下是类似的,本文主要关注vm.legacy_va_layout以及kernel.randomize_va_space参数影响下的进程空间内存宏观布局,以及vDSO和多线程下的 ...

  9. arm64_linux head.S的执行流程(3.18)- 12.msm8996 地址空间布局

    1.前言 本文基于高通8996平台,kernel版本为3.18.31. 2. 8996内存地址空间布局 通过启动时的打印信息可以知道kernel image的虚拟地址空间布局如下: 结合bootloa ...

最新文章

  1. 关于组织参加2020年全国大学生智能汽车竞赛山东赛区比赛的通知
  2. 08-图7 公路村村通
  3. macbook 分屏软件
  4. 用Starlink填补5G和光纤之间的空白
  5. linux动态库ppt,LINUX系统中动态链接库创建与使用补充_区块链白皮书代写|市场计划书项目PPT设计_Tbleg...
  6. php怎么从牌里找对子,php判断半顺,顺子, 对子实例代码
  7. epoch训练时间不同_神经网络训练的三个基本概念Epoch, Batch, Iteration
  8. jQuer实时监控input对table进行筛选
  9. 计算机换汉语快捷键,电脑常用快捷键
  10. python硬件测试开发工程师_硬件测试工程师
  11. Android Gradle指南系列
  12. Django之Form组件补充
  13. 经常使用的文件工具类
  14. 使用Visual Studio 2010打造C语言编译器
  15. Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法
  16. c语言 音符符号大全,音符符号大全
  17. windows server 2008 r2集成USB3.0
  18. 把多个EXCEL文件汇总到一个EXCEL中
  19. Linux中级(七)SAMBA文件服务器
  20. 浅谈最近流行的三起区块链51%算力攻击

热门文章

  1. labuladong的算法小抄_学习数据结构和算法的框架思维
  2. 毕业论文怎么写?一搏教你拆解论文撰写8大模块
  3. 《透明色,蒙版》如何用PPT扣除图,最快去除背景色
  4. 爱情有备胎,数据中心有MC-LAG
  5. tcpdump 命令使用教程
  6. 【PMP】活动清单、活动属性和里程碑清单
  7. java爬取智联招聘职位信息
  8. 3d打印机、三维扫描仪和三维软件设计相互相辅的作用
  9. 跳槽涨薪?NO!起薪30万的程序员都这么干……
  10. java实现快速排序以及快速排序的原理