【发布时间】: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 成功了。你介意写一个答案让我接受吗?