Who needs decrypted kernels anyways?

来源:互联网 发布:java正则表达式符号 编辑:程序博客网 时间:2024/06/05 10:57

iOS 10的一个主要变化是缺乏64位iOS内存卡的加密。在iOS 10之前,调查iOS内核的标准技术是将正在运行的内核转储出内存(如果引导程序漏洞可用,但是另一篇文章则将其解密)。不幸的是,这些倾倒的内核是KASLR slide (导致IDA中的问题),但更重要的是,它们的符号在内核启动过程中被抛弃。这种缺乏符号肯定会减缓逆向工程,而且往往会使PITA产生更多的影响。

64位内核加载(iOS前10):

iBoot从磁盘读取加密的内核缓存并验证签名/清单

iBoot将kernelcache解密并解压缩到物理内存中。

iBoot解析kernelcache,读取一些随机数据来确定 slide 偏移,并设置一个基本的内存映射。

iBoot将内核段复制到随机 slide 基础上,执行一些光段修正,然后跳转到/开始在滑动的内核基础上执行内核。

一旦内核执行(只要没有设置“keepyms”boot-arg),它将自动抛出其符号表。

真的很直白吗 如果您花费大部分时间从用户 - >内核(而不是iBoot)角度审核iOS,那么通常您可能会使用任意读取原语转储后贴/无符号的内核缓存。

=======================================

:::: iBoot for n61, Copyright 2007-2014, Apple Inc.::::  BUILD_TAG: iBoot-2261.20.20::::  BUILD_STYLE: RELEASE::::  USB_SERIAL_NUMBER: CPID:7000 CPRV:11 CPFM:03 SCEP:01 BDID:06 ::=======================================[ANS syslog] nand: Core_Boot_Clog_Load: indMemoryInHeap:  4096 KB[ANS syslog] nand: Replay_BG:Loaded from unclean shutdown[ANS syslog] nand: BG_Init:Clog Read-Only - timestamp : 723 msASP Block Device 3906250 lbas, 4096 bytes per lba, utilFormatted:1 lbaFormatted:1Boot Failure Count: 1   Panic Fail Count: 0Delaying boot for 0 seconds. Hit enter to break into the command prompt...HFSInitPartition: 0x83d223f80monitor loaded at virt: 4000000000, phys: 800c00000, entry: 4000001004Loading kernel cache at 0x804000000Uncompressed kernel cache at 0x804000000 // Pre-slid kernel cachegBootArgs.commandLine = [ ][ANS management] IOP state changed to 0x1 (mgmt state=1)ANS: in suspend to RAM*** Jumps to slid kernel here ***

现在这里是乐趣部分开始的地方。尝试从iBoot的角度来想象内核加载过程。你能发现“漏洞”吗?

64位内核转储(iOS 10之前):

在上面列出的步骤2之后,iBoot最初解密的kernelcache不会从物理内存中取消映射/覆盖。

因此,恢复符号的内核缓存所需要的是将其从原始解密的位置转储到物理内存(在0x804000000iOS 8或0x810000000iOS 9中)。

有几种不同的内存阅读策略可以用来阅读它,而我所使用的所有内容似乎都可以正常工作。我唯一注意到的是,它在A8及以上的设备上似乎更稳定。我怀疑这可能与物理内存的关系有关 - 但是我没有花费太多的时间。所以如果你遇到倾销你的5s的问题 - 尝试6或6。

这里例如是运行iOS 9.3.4的iPhone 6s的内核 -

这里写图片描述