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 获取内核缓存

  1. 访问ipsw.me下载目标设备的iOS固件(如iPad Mini 2的11.1.2固件)
  2. 解压.ipsw文件获取kernelcache文件

0x02 内核缓存解密

iOS内核缓存通常经过压缩和加密,需要解密后才能分析:

  1. 使用十六进制编辑器打开kernelcache文件
  2. 查找魔数0xFFCFFAEDFE并记录其偏移量(示例中为435)
  3. 获取lzssdec解密工具:
    wget http://nah6.com/~itsme/cvs-xdadevtools/iphone/tools/lzssdec.cpp
    g++ -o lzssdec lzssdec.cpp
    
  4. 执行解密:
    ./lzssdec -o 435 < kernelcache > kernelcache.dec
    

0x03 提取内核符号

使用joker工具转储内核符号:

  1. 运行joker工具,使用-j-m选项处理解密后的kernelcache文件
  2. 工具将输出包含以下关键符号的地址:
    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 加载解密后的内核缓存

  1. 使用IDA Pro加载kernelcache.dec文件
  2. 等待IDA完成初始分析

4.2 定位已知符号

  1. KSYMBOL_RET

    • 跳转到_kalloc_external函数
    • 查找函数末尾的RET指令
  2. KSYMBOL_CPU_DATA_ENTRIES

    • 在IDA中选择"Jump to Segment"跳转到_data段开头
    • 将该地址加上0x6000得到目标地址
  3. KSYMBOL_EL1_HW_BP_INFINITE_LOOP

    • 在IDA中打开字符串窗口(Shift+F12)
    • 搜索相关字符串
    • 查看引用,向下阅读代码找到switch case 49语句
  4. KSYMBOL_SLEH_SYNC_EPILOG

    • 查找字符串引用
    • 在引用地址下方查找第一个LDP指令
  5. KSYMBOL_X21_JOP_GADGET

    • 搜索指令MOV X21,X0
    • 记录找到的gadget地址

4.3 定位未知符号

对于难以直接找到的符号,可采用偏移比较法:

  1. 比较已知符号地址之间的偏移差
  2. 参考symbols.h中的符号地址偏移关系
  3. 例如VALID_LINK_REGISTERX21_JOP_GADGET通常相隔0x28字节
  4. 在IDA中跳转到KNOWN_ADDRESS + offset_guess
  5. 在附近区域搜索相同的指令模式

0x05 验证符号地址

  1. 将找到的符号地址添加到poc代码中
  2. 添加设备特定的if路径
  3. 添加printf()打印调试信息
  4. 编译并运行poc
  5. 观察漏洞是否成功触发

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 注意事项

  1. 不同设备、不同iOS版本的内核符号地址会有所不同
  2. 符号定位过程需要耐心和反复验证
  3. 建议记录每个符号的定位方法和依据
  4. 保持IDA数据库以便后续分析
  5. 参考已知漏洞报告(如CVE-2016-7612、CVE-2016-7633)中的符号信息

0x08 总结

本教程详细介绍了定位iOS内核符号地址的完整流程,包括内核缓存获取、解密、符号提取和IDA分析等关键步骤。掌握这些技术对于iOS内核安全研究和越狱开发至关重要。通过系统性地应用这些方法,研究人员可以为自己的设备添加内核支持并验证漏洞利用。

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解密工具: 执行解密: 0x03 提取内核符号 使用joker工具转储内核符号: 运行joker工具,使用 -j 和 -m 选项处理解密后的kernelcache文件 工具将输出包含以下关键符号的地址: 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得到目标地址 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内核安全研究和越狱开发至关重要。通过系统性地应用这些方法,研究人员可以为自己的设备添加内核支持并验证漏洞利用。