【问题标题】:Address Space Layout Randomization (ALSR) on macOSmacOS 上的地址空间布局随机化 (ALSR)
【发布时间】:2020-04-18 19:19:02
【问题描述】:

我有一个关于 macOS 上的地址空间布局随机化 (ALSR) 的问题。根据 Apple (2016) 的说法,“如果您正在编译针对 macOS 10.7 及更高版本或 iOS 4.3 及更高版本的可执行文件,则默认启用必要的标志 [for ASLR]”。本着科学精神,我决定对此进行测试在 Xcode 11.3 和 macOS Catalina 10.15.2 上使用以下程序:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int stack = 0;
    printf("%p\n", &stack);
    return 0;
}

根据 Arpaci-Dusseau & Arpaci-Dusseau (2018) 的说法,启用 ASLR 后,该程序应在每次运行时生成不同的虚拟地址(第 16 页)。但是,我每次在Xcode中运行程序,输出都是一样的,例如:

0x7ffeefbff52c
Program ended with exit code: 0

我错过了什么?

参考文献

苹果。 (2017)。避免缓冲区溢出和下溢。取自https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Articles/BufferOverflows.html

R. H. 的 Arpaci-Dusseau 和 A. C. 的 Arpaci-Dusseau(2018 年)。完整的虚拟内存系统。在操作系统中:三个简单的部分。取自http://pages.cs.wisc.edu/~remzi/OSTEP/vm-complete.pdf

【问题讨论】:

  • 你试过不优化编译吗?
  • 根据this answer,ASLR 应该涵盖全局、文本、堆栈和堆(尽管没有多少位是随机的)。你能检查一下 libc 函数是否被随机重定位吗?
  • 文档对此非常关注,独立评论者抱怨 ASLR 实施就像农民抱怨天气一样。在测试之间重新启动机器。
  • 尝试在 Xcode(或任何调试器)之外运行它。调试器或 Xcode 的某些其他诊断功能极有可能有效地禁用 ASLR。
  • @KenThomases 成功了。你介意写一个答案让我接受吗?

标签: c macos aslr


【解决方案1】:

ASLR 的明显无效是在 Xcode 中运行的产物。它使用调试器或其他一些诊断功能会有效地禁用进程的 ASLR。

在 Xcode 之外运行程序将显示您期望的 ASLR 行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多