如何检查 Mac 应用程序是否启用了 NX 或 ASLR?

信息安全 苹果系统 aslr 部门
2021-08-14 05:09:08

根据维基百科,为所有 x64 二进制文件设置了 NX 位:

OS X for Intel 支持 Apple 支持的所有 CPU 上的 NX 位(从 10.4.4 - 第一个 Intel 版本 - 开始)。Mac OS X 10.4 仅支持 NX 堆栈保护。在 Mac OS X 10.5 中,所有 64 位可执行文件都有 NX 堆栈和堆栈;W^X 保护。这包括 G5 Mac 上的 x86-64(Core 2 或更高版本)和 64 位 PowerPC。

但是,如果可执行文件不是 64 位怎么办:Mach-O executable i386

同样,对于 ASLR,维基百科说它在 10.7 及更高版本中默认启用:

在 Mac OS X Lion 10.7(2011 年 7 月发布)中,Apple 扩展了他们的实现以涵盖所有应用程序,称“地址空间布局随机化 (ASLR) 已针对所有应用程序进行了改进。它现在可用于 32 位应用程序(如堆内存保护),使 64 位和 32 位应用程序更能抵抗攻击。”

这是否意味着无法通过编译器选项退出它?如果有,我如何验证该应用程序没有?是否有任何类似于 Windows 的类比,其中一些库可能是 ASLR-ed,但其他库不是?

1个回答
  • NX 位用于 AMD 架构,XD 用于 Intel。基本上,您想知道页面是否可执行。vmmap <pid or partial process name>将列出内存块权限。

  • otool -hv <file_path>您可以通过使用并检查“PIE”标志来检查OS X 中的 ASLR(PIE,正确) 。例如,我的i386Wireshark 没有 PIE 标志(很可能 b/c 它是在没有 PIE 的情况下编译的)。我不知道它在 10.9 中如何,但在 10.7 中,您可以将程序与--no_pie标志链接以禁用 PIE。

https://github.com/electron-archive/brightray/blob/master/tools/mac/change_mach_o_flags.py有一个有趣的脚本可以回答您的问题。您实际上可以使用它来选择退出带有--no-pie脚本标志的已编译二进制文件。让我引用其中的一部分并邀请您阅读完整的来源:

...

不可执行堆

传统上,在 Mac OS X 中,32 位进程没有设置数据页来禁止执行。尽管用户程序可以调用 mprotect 和 mach_vm_protect 来拒绝执行数据页中的代码,但内核会默默地忽略此类请求而不更新页表,并且硬件会愉快地在此类页上执行代码。64 位进程总是得到适当的数据页硬件保护。此行为可通过 vm.allow_data_exec sysctl 在系统范围级别上进行控制,该 sysctl 默认设置为 1。值为 1 的位(默认设置)允许在 32 位进程的数据页上执行代码,位值为 2(默认清除)对 64 位进程执行相同的操作。

在 Mac OS X 10.7 中,可执行文件可以“选择加入”硬件保护以防止在数据页上执行代码。这是通过在 |flags| 中设置一个新位来完成的。可执行文件的 |mach_header| 的字段。当设置 MH_NO_HEAP_EXECUTION 时,将应用适当的保护,而不管 vm.allow_data_exec 的设置。

...

最重要的是,我必须添加一个指向 SO 页面的链接,其中包含与该问题相关的两个非常好的答案:https ://stackoverflow.com/questions/12824045/what-exactly-is-randomized-with-aslr-in-macos -x 和 ios