【问题标题】:How does Apples's own ASLR implementation work?苹果自己的 ASLR 实现是如何工作的?
【发布时间】:2012-04-26 12:11:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios linux memory aslr


    【解决方案1】:

    “多次重新加载”是什么意思?您应该明确退出应用程序,因为您可能会重新打开同一个进程。

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

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

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

    编辑:

    此外,如果部署目标 >= 4.3,Xcode 只会生成 PIE 二进制文件

    希望这会有所帮助 =)

    【讨论】:

    • 当我调用'malloc'来分配一些内存时: int* pIntArray = (int*) malloc (10*sizeof(int));经过测试,每次进程重新启动时,“pIntArray”指向的地址都会发生变化。但是上面提到的TEST,ObjectA的地址每次都一样,我确实退出了应用程序并更改了“不创建位置独立可执行文件”的选项。
    • 回复:您的编辑,我将“不要创建与位置无关的可执行文件”设置为“是”,它为我的目标 5.0 应用程序编译了一个非饼图应用程序 (Xcode 4.5.2)。跨度>
    • 另外根据noloader链接的论文,堆是随机的,没有PIE,所以你的VC的地址不是一个很好的例子。
    【解决方案2】:

    为了完整起见,回答这个问题的人是Apple iOS 4 Security Evaluation 中的 Dino Zovi。如果有人在 Dino 之前发表过作品,我深表歉意(我不知道你的作品或你是谁)。

    Zovi 早在 Apple 发布 iOS Security 之前就发布了他的作品。迪诺的作品还是比较完整的。

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2017-09-08
      相关资源
      最近更新 更多