iOS内核研究:定位内核gadget符号地址
字数 1826 2025-08-03 16:44:20
iOS内核研究:定位内核gadget符号地址教学文档
0x00 前言
本教程详细讲解如何定位iOS内核中的gadget符号地址,这是研究iOS内核安全性和开发越狱工具的重要基础技能。我们将基于Google Project Zero研究员Ian Beer的工作,介绍从获取内核缓存到最终定位符号地址的完整流程。
0x01 准备工作
1.1 所需工具
- IDA Pro(反汇编工具)
- joker(内核符号转储工具)
- lzssdec(内核缓存解密工具)
- 十六进制编辑器
- 目标设备的iOS固件
1.2 获取内核缓存
- 访问ipsw.me下载目标设备的iOS固件(如iPad Mini 2的11.1.2固件)
- 解压.ipsw文件获取kernelcache文件
0x02 内核缓存解密
iOS内核缓存通常经过压缩和加密,需要解密后才能分析:
- 使用十六进制编辑器打开kernelcache文件
- 查找魔数
0xFFCFFAEDFE并记录其偏移量(示例中为435) - 获取lzssdec解密工具:
wget http://nah6.com/~itsme/cvs-xdadevtools/iphone/tools/lzssdec.cpp g++ -o lzssdec lzssdec.cpp - 执行解密:
./lzssdec -o 435 < kernelcache > kernelcache.dec
0x03 提取内核符号
使用joker工具转储内核符号:
- 运行joker工具,使用
-j和-m选项处理解密后的kernelcache文件 - 工具将输出包含以下关键符号的地址:
KSYMBOL_OSARRAY_GET_META_CLASS KSYMBOL_IOUSERCLIENT_GET_META_CLASS KSYMBOL_IOUSERCLIENT_GET_TARGET_AND_TRAP_FOR_INDEX KSYMBOL_CSBLOB_GET_CD_HASH KSYMBOL_KALLOC_EXTERNAL KSYMBOL_KFREE KSYMBOL_OSSERIALIZER_SERIALIZE KSYMBOL_KPRINTF KSYMBOL_UUID_COPY
0x04 IDA Pro分析内核缓存
4.1 加载解密后的内核缓存
- 使用IDA Pro加载
kernelcache.dec文件 - 等待IDA完成初始分析
4.2 定位已知符号
-
KSYMBOL_RET:
- 跳转到
_kalloc_external函数 - 查找函数末尾的
RET指令
- 跳转到
-
KSYMBOL_CPU_DATA_ENTRIES:
- 在IDA中选择"Jump to Segment"跳转到
_data段开头 - 将该地址加上0x6000得到目标地址
- 在IDA中选择"Jump to Segment"跳转到
-
KSYMBOL_EL1_HW_BP_INFINITE_LOOP:
- 在IDA中打开字符串窗口(Shift+F12)
- 搜索相关字符串
- 查看引用,向下阅读代码找到
switch case 49语句
-
KSYMBOL_SLEH_SYNC_EPILOG:
- 查找字符串引用
- 在引用地址下方查找第一个
LDP指令
-
KSYMBOL_X21_JOP_GADGET:
- 搜索指令
MOV X21,X0 - 记录找到的gadget地址
- 搜索指令
4.3 定位未知符号
对于难以直接找到的符号,可采用偏移比较法:
- 比较已知符号地址之间的偏移差
- 参考
symbols.h中的符号地址偏移关系 - 例如
VALID_LINK_REGISTER和X21_JOP_GADGET通常相隔0x28字节 - 在IDA中跳转到
KNOWN_ADDRESS + offset_guess - 在附近区域搜索相同的指令模式
0x05 验证符号地址
- 将找到的符号地址添加到poc代码中
- 添加设备特定的if路径
- 添加
printf()打印调试信息 - 编译并运行poc
- 观察漏洞是否成功触发
0x06 关键符号说明
| 符号名称 | 描述 |
|---|---|
| KSYMBOL_RET | 函数返回指令地址 |
| KSYMBOL_CPU_DATA_ENTRIES | CPU相关数据结构 |
| KSYMBOL_EL1_HW_BP_INFINITE_LOOP | 硬件断点处理循环 |
| KSYMBOL_SLEH_SYNC_EPILOG | 同步异常处理结尾 |
| KSYMBOL_X21_JOP_GADGET | 跳转导向编程使用的gadget |
| KSYMBOL_KALLOC_EXTERNAL | 内核内存分配函数 |
| KSYMBOL_KFREE | 内核内存释放函数 |
0x07 注意事项
- 不同设备、不同iOS版本的内核符号地址会有所不同
- 符号定位过程需要耐心和反复验证
- 建议记录每个符号的定位方法和依据
- 保持IDA数据库以便后续分析
- 参考已知漏洞报告(如CVE-2016-7612、CVE-2016-7633)中的符号信息
0x08 总结
本教程详细介绍了定位iOS内核符号地址的完整流程,包括内核缓存获取、解密、符号提取和IDA分析等关键步骤。掌握这些技术对于iOS内核安全研究和越狱开发至关重要。通过系统性地应用这些方法,研究人员可以为自己的设备添加内核支持并验证漏洞利用。