逆向笔记 - iOS系统安全机制

2017-07-03  本文已影响0人  文瑶906

一些经常遇到的问题:

iOS 系统官方 安全架构

硬件和固件:

软件

软件.png

硬件和固件:

软件:

从 上图可以看出 iOS 安全的几个点:

安全启动链

系统启动过程中每一步包含的所有组件都已经经过 苹果签名,并且只有在验证了信息链后才能继续往后执行。

启动流程:系统启动 -> Boot ROM -> 底层引导加载程序(LLB) -> 引导加载程序(iBoot) -> Kernel

安全启动链.png

系统软件授权

为避免设备降级为缺少最新安全性更新的早期版本,iOS采用了为名为 “系统软件授权”的过程。
下面的流程是iTunes 刷入固件到手机上面的流程
固件 -> CPU -> iTunes -> 固件签名 -> 服务器 -> 开启验证 -> 验证许可 || 验证许可+随机串 -> 通过验证
如图:


开启验证.png

固件通过 CPU 刷到手机上面去,CPU在写入我们的固件之前,会让 iTunes 把 我们的 固件签名 发送到服务器,如果服务器开启了验证,就返回一个验证许可或者是 验证许可+随机串,拿到验证许可后,通过验证。cpu才会真正把我们的固件刷到手机上去。

如果关闭 开启验证,在早期的版本,只会返回一个验证许可,可以通过保存 SHSH来欺骗cpu刷入我们的固件。
如图:


Snip20170704_7.png

在后面的版本,苹果除了返回验证许可之外,还返回了一个随机串。这个随机串是和硬件相关的,并且只能使用一次。也就保证了这个是不能模拟的,所以保存SHSH无效。
如图:

Snip20170704_8.png

应用代码签名:

为确保所有应用均来自批准的已知来源并且未被篡改,iOS要求所有可执行代码均使用 Apple 颁发的证书进行签名。
包括

这三个在我们运行的时候会进行签名验证。
验证通过以后,才能正常运行。
如图:

应用代码签名.png

应用沙盒机制(Sandbox)

/var/mobile/Containers/Data/Application/[GUID]
保证我们所有的应用都是在一个沙盒模块里面,如下图

沙盒模块.png

在这个图片中可以看到:
安装完一个应用后,都是运行在一个隔离的环境,每一个应用都是一个隔离的环境,并且互不干扰,也不能随意去访问其他应用程序的数据。

沙盒的特点:

数据执行保护(DEP)

处理器能区分哪部分内存是可执行代码以及哪部分内存是数据。
DEP不允许数据的执行,只允许代码执行。

如图,讲解代码无法再数据段里执行

数据段.png


在上边的图中,恶意代码作为数据,写入到数据段里面去,是不能被执行的,但是如果恶意代码 放在了代码段,就可以执行。

但是:

可以通过ROP创建一块可写入可执行的内存区域

ROP的含义

ROP就是相当于把程序里面不同地方的代码片段组合起来,通过一个指定流程去执行,来达到我们最终的目的

如果我们通过 ROP 写入代码,这个代码是没有被签名的,这个时候代码签名的好处就体现出来了。这段代码是不会被允许执行的

地址空间布局随机化(ASLR)

在 iOS中,二进制文件、库文件、动态链接文件、栈和堆内存地址的位置全部是随机的。

把这些文件加载到内存中的时候,它加载的机地址每次都是随机变化的,可以通过命令来查看应用模块的机地址:

如图:
加载地址是 9dd800


应用模块机地址.png 图片.png

加密和数据保护

文件内容是根据 文件密钥加密的
文件秘钥是 根据 类密钥加密的

Snip20170705_7.png
上一篇 下一篇

猜你喜欢

热点阅读