内存安全 - 地址空间布局随机化(ASLR)
说明
- 学过编译原理可知,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)相关推荐
- linux内存布局和地址空间布局随机化(ASLR)下的可分配地址空间
https://zsummer.github.io/2019/11/04/2019-11-04-aslr/ 地址空间布局随机化(ASLR) <mmap的随机化> <Meltdown( ...
- 关闭aslr oracle,地址空间布局随机化 (Address Space Layout Randomization, ASLR)
地址空间布局随机化 (Address Space Layout Randomization, ASLR) ASLR 是 Oracle Solaris 系统的一种功能,利用此功能可以随机生成进程地址空间 ...
- 关于Windows上地址空间布局随机化防御机制的分析(下)
将32位程序重新编译为64位程序,以使地址空间布局随机化更有效 尽管Windows的64位版本已经成为主流十多年了,但32位版本的使用者仍然很多.有些程序确实需要保持与第三方插件的兼容性,比如web浏 ...
- linux的地址随机化ASLR,[翻译]Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)...
前提条件: 经典的基于堆栈的缓冲区溢出 虚拟机安装:Ubuntu 12.04(x86) 在以前的帖子中,我们看到了攻击者需要知道下面两样事情 堆栈地址(跳转到shellcode) libc基地址(成功 ...
- Linux开机启动过程(6):页表的初始化、避开保留的内存、地址随机化
内核引导过程. Part 6. 简介 这是内核引导过程系列文章的第六部分.在前一部分,我们已经看到了内核引导过程的结尾,但是我们跳过了一些高级部分. 你可能还记得,Linux内核的入口点是 main. ...
- Linux内核地址空间布局详解
1. 简介 虽然x86_64的物理地址范围为64bit,但是因为地址空间太大目前不可能完全用完,当前支持57bit和48bit两种虚拟地址模式. 地址模式 单个空间 用户地址空间 内核地址空间 32位 ...
- Linux mem 2.2 内核地址空间布局详解
文章目录 1. 简介 2. 内核页表初始化 2.0 decompress阶段 2.1 `head_64.S`和`head64.c` 2.2 start_kernel() 2.2.1 物理内存(e820 ...
- Linux下x86_64进程地址空间布局
在x86_64下和i386下是类似的,本文主要关注vm.legacy_va_layout以及kernel.randomize_va_space参数影响下的进程空间内存宏观布局,以及vDSO和多线程下的 ...
- arm64_linux head.S的执行流程(3.18)- 12.msm8996 地址空间布局
1.前言 本文基于高通8996平台,kernel版本为3.18.31. 2. 8996内存地址空间布局 通过启动时的打印信息可以知道kernel image的虚拟地址空间布局如下: 结合bootloa ...
最新文章
- 关于组织参加2020年全国大学生智能汽车竞赛山东赛区比赛的通知
- 08-图7 公路村村通
- macbook 分屏软件
- 用Starlink填补5G和光纤之间的空白
- linux动态库ppt,LINUX系统中动态链接库创建与使用补充_区块链白皮书代写|市场计划书项目PPT设计_Tbleg...
- php怎么从牌里找对子,php判断半顺,顺子, 对子实例代码
- epoch训练时间不同_神经网络训练的三个基本概念Epoch, Batch, Iteration
- jQuer实时监控input对table进行筛选
- 计算机换汉语快捷键,电脑常用快捷键
- python硬件测试开发工程师_硬件测试工程师
- Android Gradle指南系列
- Django之Form组件补充
- 经常使用的文件工具类
- 使用Visual Studio 2010打造C语言编译器
- Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法
- c语言 音符符号大全,音符符号大全
- windows server 2008 r2集成USB3.0
- 把多个EXCEL文件汇总到一个EXCEL中
- Linux中级(七)SAMBA文件服务器
- 浅谈最近流行的三起区块链51%算力攻击