推荐文献:

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 的二进制文件,通常通过以下方式实现:
    gcc -fPIC -shared -o libtest.so test.c
    gcc -fPIE -pie -o test test.c
    可以通过 readelf 检查 ELF 文件是否支持 ASLR:
    readelf -h test | grep Type
  • 如果输出 Type:EXEC,则未启用 ASLR
  • 如果输出 Type:DYN,则启用了 ASLR
    从我自己的实践来看,在 GDB 二进制打印段或者指令地址时,每次虚拟地址可能都不一样。

感觉对于计算机安全的知识掌握的还是不够