ASLR技术
推荐文献:
-
其中第三篇很好
基础知识
地址空间布局随机化(ASLR,Address Space Layout Randomization) 是一种内存保护技术,旨在防止攻击者利用固定地址执行恶意代码。ASLR 通过在程序运行时随机化关键数据结构的位置(如堆、栈、共享库、代码段等)来增加攻击的难度,使得传统的返回地址覆盖(Return-Oriented Programming,ROP)和缓冲区溢出攻击等变得困难。
可以参考第三篇参考文献
ASLR 的局限性:
- 它不能解决漏洞,而是增加利用漏洞的难度
- 并不追踪或报告漏洞
- 不能对编译时没有开启 ASLR 支持的二进制文件提供保护
- 不能避免被绕过
尝试绕过 ASLR 的技术:
- 利用地址泄露
- 例如,格式化字符串漏洞 (printf(“%p”, ptr)) 可能泄露函数地址。
- 地址喷射(Heap Spraying & JIT Spraying)
- 在 JavaScript、Flash 等环境下,攻击者可以大量分配对象,并填充可能的地址,增加命中概率。
- 针对 ASLR 实现的缺陷来猜测地址,常见于系统熵过低或 ASLR 实现不完善。
- 32-bit 系统的 ASLR 熵(entropy)较低(通常只有 8–16 位),暴力枚举的成本较低。
- 利用侧信道攻击
ASLR 影响的内存区域:
- 堆
- 栈
- 共享库
- 可执行文件基地址
- 内核空间(Kernel ASLR)
现代 ASLR 增强技术:
- KASLR:随机化内核空间地址
- PAC(Pointer Authentication Code):防止指针篡改。
- CFG(Control Flow Guard):防止代码执行流被劫持。
- Fine-grained ASLR(FG-ASLR):对每个函数、变量地址进行随机化。
在编译与体系结构的视角
编译器需要生成能够支持 ASLR 的二进制文件,通常通过以下方式实现:
可以通过 readelf 检查 ELF 文件是否支持 ASLR:gcc -fPIC -shared -o libtest.so test.c gcc -fPIE -pie -o test test.c
readelf -h test | grep Type
- 如果输出 Type:EXEC,则未启用 ASLR
- 如果输出 Type:DYN,则启用了 ASLR
从我自己的实践来看,在 GDB 二进制打印段或者指令地址时,每次虚拟地址可能都不一样。
感觉对于计算机安全的知识掌握的还是不够
评论