苹果自己的ASLR实现是如何工作的?



根据ASLR(地址空间布局随机化),它提供随机堆栈和堆分配以及每次进程启动时的页面加载,并随机化对象放置在给定进程的虚拟空间中的地址。

但是在我运行在ios上的应用程序中,我创建了一个名为ObjectA的对象,经过几次重新加载进程,我发现ObjectA的地址都是一样的,没有随机化。

苹果自己的ASLR实现是如何工作的?为什么 ObjectA 的地址都是一样的?

"多次重新加载"是什么意思?您应该显式退出应用程序,因为多任务处理可能会重新打开相同的进程。

例如。这是我打印出UIViewController实例地址的应用程序之一,因为您可以看到每次执行中对象的地址都不同。

First run: <DCViewController: 0x13d4a0>
Second run: <DCViewController: 0x2880f0>
Third run: <DCViewController: 0x2a2050>

(我不认为是这种情况,但在 XCode 中,有一个选项可以在"构建设置"下启用 PIE(位置独立可执行文件),它被称为"不要创建位置独立可执行文件",您可以轻松找到它,但在搜索框中键入"饼"。此选项应设置为"否")。

编辑:

此外,Xcode 只会在部署目标为>= 4.3 时才制作 PIE 二进制文件

希望这有帮助=)

为了完整起见,回答这个问题的人是Apple iOS 4安全评估中的Dino Zovi。如果其他人在Dino之前发表文章,我深表歉意(我不知道这项工作或你是谁)。

Zovi在苹果发布iOS Security之前就发布了他的东西。迪诺的作品还是比较完整的。

最新更新