首页 > 编程知识 正文

ios基于什么内核(ios chrome内核)

时间:2023-05-06 07:03:56 阅读:758 作者:1945

上周,谷歌Project Zero项目团队成员伊恩比尔(Ian Beer)在推特上发文称,他找到了一种通过task_for_pid_0或tfp0获得内核内存读写权限的方法。这一发现可以帮助那些指导IOS 11内核安全性研究的人。

一、内核符号的缺失

虽然这个漏洞的发布更令人兴奋,因为它意味着可以构建一种新的越狱方法,但我还是想借此机会再次研究移动安全问题。我过去的大部分经验主要是关于测试应用程序的安全级别。但是这次,我想更多地了解操作系统的本质。

乔纳森levin在介绍他即将推出的工具集时表示:这是为那些在过程中已经拥有kernel_task port(tfp0)权限,但不知道下一步该做什么的人准备的。这似乎是进一步研究的好机会。

昨天发布了Beer的漏洞报告和POC代码,非常振奋人心。尤其是文档书写工整,易读易懂(包括一个ASCII艺术栈框架的例子)。就在我准备开始测试的时候,我突然发现了一个问题。虽然Beer给了几个设备的内核符号足够友好,但是没有我即将使用的设备的内核符号。幸运的是,他给出了如何在文档中找到内核符号的详细说明。所以,我准备开始这项工作。

二、寻找内核符号过程

本文剩下的部分主要介绍我搜索内核符号的全过程。希望这个方法应用到你的设备上也适用。除了导出的内核符号之外,我找不到任何其他解释如何做到这一点的文档,所以我想为其他需要的人(包括我自己)写这篇文章。有了乔纳森莱文强大的工具包,这项工作可能就没有必要了,但在我看来,这是一个有趣的学习和实践过程。

找到内核符号的第一步是获取相应的IOS版本的kernelcache。我在https://ipsw.me/下载了我的iPad Mini2的固件版本11.1.2和一个在符号中定义了内核符号的设备。c拥有一个定义了内核符号的固件可以帮助我确认我要找的内核符号是否正确。因为我们已经知道这个设备的正确内核符号。

提取。ipsw文件,我开始使用莱文的工具Joker。在尝试了一段时间工具的各种参数选项后,我选择使用-j、-m参数来转储kernelcache文件的所有可用内核符号。包括我需要的以下内核符号的地址:

KSYMBOL _ OSARRAY _ GET _ META _ CLASS KSYMBOL _ IOUSERCLIENT _ GET _ META _ CLASS

KSYMBOL _ iouseclient _ GET _ TARGET _ AND _ TRAP _ FOR _ INDEX

KSYMBOL_CSBLOB_GET_CD_HASH

KSYMBOL _ KALLOC _ EXTERNAL

KSYMBOL_KFREE

KSYMBOL _ OSSERIALIZER _ serializer

KSYMBOL_KPRINTF

KSYMBOL_UUID_COPY找到9个内核符号地址,但剩余符号的地址无法通过工具导出(或者符号从未被标记,如JOP小工具)。因此,我们现在必须在IDA pro中加载kernelcache文件进行分析和搜索。当然,你也可以使用其他拆解工具,如二元忍者、Hopper或radare2。

在开始之前,我们需要解码kernelcache文件。我在这本指南中找到了一条路。

*在十六进制编辑器中打开kernelcache并查找0xFFCFFAEDFE,注意偏移量(435)

* wget-q http://na h6.com/~ itsme/CVS-xdadev tools/iphone/tools/lzssdec . CPP

* g -o lzssdec lzssdec.cpp

* ./lzssdec-o 435 kernel cache kernel cache . dec # 435是偏移量字节计数到0xFFCFFAEDFE头

首先,我使用IDA将已知内核符号的固件加载到kernelcache中,这样我就可以知道我正在寻找的内核符号的汇编形式是什么样子的。

下一个最容易找到的内核符号是KSYMBOL_RET。找到已知内核符号的地址后,我看到RET指令从_kalloc_external函数跳回。所以很容易在IDA中加载我的设备的内核缓存,然后在同一个函数中找到RET。要找到剩余的内核符号,我们可以从其他技巧中学习。

接下来是KSYMBOL_CPU_DATA_ENTRIES。提示显示它位于数据部分的地址0x600。所以在IDA中选择“跳转到段”,然后选择转到()的起始地址。data)数据段,写下起始地址值,并加上0x600得到我需要的内核符号地址。

接下来我发现的两个内核符号实际上是列表中的最后两个,KSYMBOL_EL1_HW。

_BP_INFINITE_LOOP和KSYMBOL_SLEH_SYNC_EPILOG。在IDA中打开Strings Windows(Shift+F12),并搜索字符串。双击后,我们就可以来到字符串所在处。

对于第一个,我向下寻找直到找到跳转case 49的地方,并记下此时地址。

iPod Touch 6G中的KSYMBOL_EL1_HW_BP_INFINITE_LOOP

对于第二个,在已知内核符号文件中的地址是在XREF‘d字符串下边几个LDP指令中的第一个的地址处。

最后一个比较简单的是KSYMBOL_X21_JOP_GADGET。在看到所需的指令是MOV X21, X0后,我直接在IDA中搜索文本就可以找到我设备中的此内核符号。

最后5个是最难找到的。我这一次的搜索并没有直接找到提示的内容。所以我开始研究我所发现的这些符号地址并试着寻找他们之间的关联。在用这些地址做一些基本的减法后,我发现他们之前隔着相同倍数的距离。这至少帮我减小了搜索的范围。我还比较了我已知的这些符号中最近的两个相距多少。例如:VALID_LINK_REGISTER和X21_JOP_GADGET之间只差0x28个字节。

距离最近的两个符号可以帮助我缩小搜索范围

于是我在纸上记录下已知地址处的汇编指令,加载我设备的kernelcache,并跳转到KNOWN_ADDRESS + my offset guess(已知地址+我猜测的地址偏移量)处。然后在附近寻找相同的汇编指令。

有时候笔和纸的效果最好

在代码中将找到的内核符号写入一个数组,之后只需要添加一个if条件就能应用于我的设备当中。

最后将我的iPad连接到电脑,打开Xcode项目并运行。得到如下结果:

我所做的iPad Mini 2 WiFi补丁可以在这里找到。

三、结语

整个过程对我来说完全是陌生的(但是非常有趣!),所以欢迎大家指正出文章中任何有错误或者理解偏差的地方。如果你知道有寻找这些地址更加简单的方法,也请你反馈给我。我喜欢学习使用新的工具和技术。所以如果能看到这些,我会非常高兴,并且继续更新这篇文章。

登录安全客 - 有思想的安全新媒体 http://bobao.360.cn/index/index,或下载安全客APP来获取更多最新资讯吧~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。