首页
社区
课程
招聘
[翻译]iOS内核调试教程
发表于: 2018-2-5 21:43 5419

[翻译]iOS内核调试教程

2018-2-5 21:43
5419

图片描述

iOS 内核是一种非常复杂的软件,如果你需要和它打交道,拥有一个调试器会非常的方便。它拥有单步运行代码,设置断点,读写内存和寄存器等功能。幸运的是,Apple 工程师们自用的开发调试器已经内置在产品的发行版里了。但是它有点难以安装和运行,因此我希望这篇教程能够帮到大家。

图片描述

进行基本的内核调试所需要的东西如下:

图片描述

图片描述

iOS 内核并不能被即时地调试。这是因为苹果的工程师们不想它被轻易地发现漏洞。所以我们必须对设备进行越狱以设置正确的启动参数,并打上合适的内核补丁。

使用 RedSn0w 对 iOS 设备越狱的过程可以在其他地方找到。当你使用这一工具的时候,设置启动参数是非常重要的。你可以通过Extras -> Even More -> Preferences -> Boot Args来设置这一参数。在下一步中,你应该输入下列字符串"debug=0x8f -v wdt=0"。

这些参数是为了告诉内核去做这些事:

图片描述

图片描述

现在设备已经被挂起,我们就需要启动 serialKDPproxy。用法是./SerialKDPProxy。在我的例子中是./SerialKDPProxy /dev/tty.usbserial-AH00NR2W。在此之后,应该会有各种各样的调试信息输出在设备的控制台上。你也可以在设备启动之前运行它,这样就会有大量输出告诉你当设备启动时它到底做了些什么。例如 kernel slide 就会显示出来,它可以让我们确定函数地址。

图片描述

因为 serialKDPproxy 转发了我们想要的信息,现在我们可以轻易地附加调试内核了。首先你需要使用下列命令启动 gdb.gdb -arch armv7.这一命令告诉 gdb 我们要调试的是 iOS 设备而不是使用 i386 架构的 OS X 应用.当你进行 gdb 提示符后,你需要输入 target remote-kdp,然后输入attach localhost.然后你应该能获得一个已连接上的反馈信息。如果不确定是否正确地设置了启动信息,你可以使用 serialKDPproxy 来验证是否能附加上正确的设备。

你还需要做的一件事就是,如果你有一份符号化后的 kernelcache,你可以把这一参数加入 gdb 的启动参数中去。这样 gdb 就会在你连接上时把这一符号表加入到内核进程当中,这可以使你通过函数名来引用函数而不是地址。

图片描述

现在你的 gdb 已经具备了它该有的能力。你可以使用命令p (int )address获取某一块内存区域的内容,你也可以使用命令set {int} = val设置内容的值。你可以使用x/i addr或是disassemble命令反汇编函数中一块代码。你也可以使用命令info registers查看所有寄存器的值。可以通过break *(addr)命令设置断点。这些都是 gdb 可以完美地执行的命令。

这些功能非常的强大,在很多场合它都能有助于你的逆向工作。

有时候一分钟的调试可以抵得上一小时的静态二进制代码分析。下一步我会举一个这样的例子。

图片描述

图片描述

假设你正在分析函数 OSUnserializeXMLfor 寻找漏洞,你想要知道当它在某个特定的时候被调用时栈中的情况。你可以在诸如 IDA Pro 这样的程序中查看内核的反汇编代码,以计算出可能的情况。或是你可以只在 IDA 中找到 OSUnserializeXMLfor 函数的地址,然后把它加入到 kernel slide 中,这样它就会在启动时把真实的地址打印到串口的控制台上,然后对这个地址设置一个断点。当函数被调用时,它会暂停下来,你就获取了程序的控制权以决定下一步要做什么。

这就是本教程的全部内容,我希望你能从中获益。

本文章由看雪翻译小组 梦野间 编译
原文链接:http://www.instructables.com/id/IOS-Kernel-Debugging/

 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
2
整体翻译的很好,句子很通顺。有些地方翻译腔略重,可以再改进一下,举个例子如下:


原文: however it is crucial that you add the appropriate boot arguments when you use the tool.
原译文: 当你使用这一工具的时候,设置启动参数是非常重要的。

个人建议:when 尽量不要翻译为当...的时候;语句可以再精简一些

使用该工具时,添加正确的启动参数至关重要。


以上只是个人建议,欢迎大家一起讨论~
 
2018-2-6 11:32
1
雪    币: 2166
活跃值: (3226)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
3
哆啦咪 整体翻译的很好,句子很通顺。有些地方翻译腔略重,可以再改进一下,举个例子如下: 原文: however it is crucial that you add the appropriate b ...
和哆啦咪版主的E语水平比,我那E语简直
2018-2-6 16:27
0
雪    币: 3757
活跃值: (1757)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
4
哆啦咪 整体翻译的很好,句子很通顺。有些地方翻译腔略重,可以再改进一下,举个例子如下: 原文: however it is crucial that you add the appropriate b ...
过年期间都没上看雪,才看见版主的回复
谢谢版主的建议
其实我也感觉有时候翻得太过啰嗦,就是没怎么考虑过怎么去简化
今后我会尽量改进
2018-3-3 16:45
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2018-3-3 23:28
0
游客
登录 | 注册 方可回帖
返回
//