返回首页 iOS 安全攻防

废除应用程序的 ASLR 特性

ASLR (Address Space Layout Randomization),即地址空间随机布局。大部分主流的操作系统都已实现了 ASLR,以防范对已知地址进行恶意攻击。iOS 从 4.3 开始支持 ASLR,Android 从 4.0 也支持了 ASLR 机制。

ASLR 的存在,给 iOS 系统越狱造成了很大的困难,某些不完美越狱方案就是因为攻破不了或者绕不开 ASLR ,所以每次重新启动后地址再度随机偏移,需要重新进行越狱操作。与此同时,ASLR 也给应用层攻击带来了一些困难,不同进程会造成不同的地址空间偏移,而且在运行时才可确定其偏移量,不易锁定攻击地址。

Mach-O 文件的文件头会记录二进制的属性标识,有个 flag 叫做 PIE (Position Independent Enable)。开启了 PIE 的二进制文件,在执行时会产生 ASLR 。

我们可以使用 otool 工具,来查看任意应用程序二进制文件的属性,以支付宝为例:
otool -hv Portal

aslr

有 PIE 标识,表示该程序在启动时会产生随机地址布局。

aslr1removePIE 是个去掉 PIE flag 的工具。

坏消息是,年久失修,它不支持 iOS7 。 好消息是,我们还有 2 个变通方法可以走。

  • 利用 Theos 编译 removePIE
  • 改编一个 Mac 版的 MyRemovePIE

非越狱开发者可能不熟悉 Theos ,低学习成本的做法是第二种,那么让我们来改编一个 Mac 版的 MyRemovePIE 吧。 (懒得动手的可以直接到这里下载 demo )

创建一个 Command Line Tool 工程,

aslr2

然后复制 removePIE.c 代码到 main.c 中,并且修改第 43 行: if(currentHeader.magic == MH_MAGIC){ //little endian

添加 iOS7 的判断条件: if(currentHeader.magic == MH_MAGIC || currentHeader.magic == 0xbebafeca ){ //little endian

编译后生成可执行文件 MyRemovePIE .

利用我们编译生成的 MyRemovePIE 来处理应用程序:

./MyRemovePIE Portal

aslr3

这样以后支付宝 Portal 再被启动执行就不会具有 ASLR 特性了

aslr4

如何验证一下结果呢?

把处理过的 Portal 二进制拷贝回 iPhone ,启动支付宝钱包应用,然后 gdb 该进程,利用 info sh 命令查看偏移:

aslr5

偏移量为 0 ,嗯,这下就好了。一些手动处理的过程可以升级为自动了~ aslr6