iOS 安全与逆向基础

2.3k 字
本文介绍 iOS 安全与逆向工程的基础知识,包括 iOS 越狱原理与工具、砸壳技术、静态分析和动态调试等核心概念,为 iOS 安全研究提供入门指导。

iOS 越狱

常用越狱工具

  1. palera1n: 支持 iOS 17
  2. checkra1n: 支持 iOS 12 到 14
  3. unc0ver: 支持 iOS 11 到 14

上述工具的使用方法:

  • 通过连接电脑或 IPA 包将越狱工具安装到设备上,打开工具并点击"Jailbreak"按钮,设备重启后完成越狱。

利用的漏洞:

  • palera1n 和 checkra1n 利用硬件层面漏洞(checkm8 bootrom 漏洞,存在于 A7 到 A11 芯片),无法通过软件更新和修复
  • unc0ver 利用软件层面漏洞,可通过软件更新修复。unc0ver 是半不完美越狱工具,每次设备重启后需要重新激活越狱

可能的软件漏洞包括:

  • 反序列化: 攻击者构造特定的、包含恶意代码的序列化数据,通过网络请求等途径传递给目标程序,目标程序进行反序列化时就会执行恶意代码。
  • 内存溢出:攻击者通过内存溢出覆盖程序的控制流,执行其注入的恶意代码。

越狱工具原理

  1. 利用漏洞(内核漏洞、沙盒逃逸等)获取系统的高权限
  2. 进一步提权,获取 root 权限,将文件系统从只读更改为可读写
  3. 在设备上安装越狱管理器来安装各种越狱插件和应用
  4. 修改启动文件,安装启动守护进程,以在设备重启后保持越狱状态
  5. 修改系统文件和进程,防止被安全软件检测

越狱种类

根据越狱效果分以下几种:

  • 完美越狱(Untethered Jailbreak):设备重启后,越狱状态保留,无需再次越狱
  • 半完美越狱(Semi-Tethered Jailbreak):设备重启后,越狱状态丢失,但只要在设备上执行某些操作即可恢复越狱
  • 不完美越狱(Tethered Jailbreak):设备重启后,越狱状态丢失,需要连接电脑使用越狱工具引导开机并再次执行越狱操作
  • 半不完美越狱(Semi-Untethered Jailbreak):设备重启后,越狱状态丢失,需要连接电脑再次执行越狱操作

现在主要的越狱类型是半不完美越狱不完美越狱

越狱状态

  • 恢复到越狱之前状态:重启,或者再次使用越狱工具来恢复
  • 查看设备是否越狱:安装 爱思助手

越狱检测

  1. 检查越狱应用和文件:例如/Applications/Cydia.app、/usr/sbin/sshd 等,如果存在则说明越狱
  2. 检查目录读写权限:程序沙盒目录之外的目录应该是不可写的,如果可写则说明越狱
  3. 检查系统或私有 API: 有些系统 api(例如 sysctl)或者私有 api(例如 fork)在非越狱设备上不可调用,如果调用成功说明越狱
  4. 检查动态链接库:某些动态库(如 Frida)在越狱设备上会被使用,如果这些库存在则说明越狱
  5. 检查可疑环境变量:例如 DYLD_INSERT_LIBRARIES

反越狱检测

  1. 隐藏越狱文件和目录
  2. 修改系统 API 的返回值,欺骗检测程序
  3. 注入自定义动态库,例如使用 Frida 来注入 JavaScript 脚本,修改应用程序的行为

反反越狱检测

  1. 综合使用多种方式,增加绕过检测的难度
  2. 结合 MDM 检测,通过 MDM 限制设备行为

越狱包管理器

越狱版 AppStore:

  • iOS 15 以上通常用 Sileo
  • iOS 15 以下通常用 Cydia

可以管理软件源,从软件源下载应用和插件并进行安装

常用插件

  • OpenSSH: 通过 ssh 访问 iPhone
  • Filza: 最常用的的文件管理器
  • AFC2=Apple File Conuit "2": 允许通过 USB 访问 iPhone,由此支持 iFunBox、3uTools、爱思助手等工具
  • AppSync Unified: 让系统不再验证签名,app 不会因为签名原因安装失败
  • CocoaTop64: 查看进程详情,比如进程 Flag、二进制文件位置等
  • iCleaner Pro: 插件管理,比如:临时开启或禁用某个/某些插件
  • Mterminal: 终端工具

iOS"砸壳"("脱壳")

砸壳原理

iOS 应用在发布时会对二进制文件进行加密和签名,以防止未授权的修改和分析。
“砸壳”(也称为“脱壳”)就是去除应用程序的加密和签名保护,获得未加密的二进制文件。

砸壳通常需要在越狱的 iOS 设备上进行,因为需要访问系统的底层资源和运行未签名的代码。

常用的砸壳工具

  • Frida: 跨平台的动态分析和插桩工具,允许在运行时修改应用程序的行为
  • Clutch: 用于解密加密的 iOS 应用程序的脱壳工具
  • dumpdecrypted: 通过动态库注入来解密 iOS 应用程序的工具,用于生成未加密的可执行文件

砸壳步骤

  1. 将需要砸壳的应用程序和砸壳工具(例如 Frida、Clutch 等)安装到越狱设备上
  2. 执行砸壳工具的命令,砸壳工具会从内存中获取未加密的二进制文件,并保存到设备
  3. 将未加密的二进制文件传输到电脑,并使用逆向工具(例如 IDA Pro、Hopper Disassembler 等)进行分析,查看和修改代码

静态分析

静态分析是指在不运行目标应用程序的情况下,分析其二进制文件、代码结构和资源,理解应用程序的行为和逻辑。

常用的反汇编、反编译工具

  • IDA Pro: 提供强大的反汇编、静态分析和调试功能,并支持插件扩展和脚本自动化
  • Hopper Disassembler: 提供反汇编和反编译功能,支持多种架构,并具有用户友好的图形界面和脚本支持

静态分析步骤

  1. 通过“砸壳”获取目标应用程序的二进制
  2. 使用反汇编工具将二进制文件转换为汇编代码,使用反编译工具将汇编代码转换为更高级别的伪代码

使用静态分析工具,我们可以:

  • 分析应用程序的代码结构,包括函数、方法、类和模块之间的关系,识别关键函数和方法,了解它们的调用关系和参数
  • 提取应用程序中的字符串和其他资源,如图片、配置文件等,提供有关应用程序功能和逻辑的线索
  • 尝试恢复应用程序中的符号信息,如函数名和变量名,这些符号信息可以极大地帮助理解代码逻辑
  • 生成控制流图(CFG)和数据流图(DFG),帮助理解代码的执行路径和数据传递,直观地展示代码的逻辑结构和依赖关系

静态分析的局限性:

  1. 一些应用程序可能使用代码混淆和加密技术,增加静态分析的难度
  2. 静态分析无法获取运行时的动态行为和数据,可能会错过一些依赖于特定输入或环境的逻辑

动态调试可以弥补这些局限性。

动态调试

动态调试是指在应用程序运行时对其进行分析和修改,理解应用程序的行为和逻辑。

常用的动态调试工具

  • LLDB:Xcode 自带的调试器,支持 iOS 应用程序的动态调试,可以设置断点、检查内存、跟踪函数调用等
  • Frida:一个动态分析和代码注入工具,允许在运行时修改应用程序行为、拦截函数调用和进行内存操作

动态调试步骤

  1. 通过“砸壳”获取目标应用程序的二进制,重新签名并安装到越狱设备上
  2. 将必要的调试工具(例如 LLDB、Frida 等)安装到越狱设备上
  3. 使用调试器附加到目标应用程序的进程,以便监控和控制其执行。 例如在 LLDB 中,可以使用 attach 命令附加到正在运行的进程

使用动态调试工具,我们可以:

  • 在感兴趣的函数或代码位置设置断点,允许调试器进行检查和修改
  • 修改内存中的数据,以观察不同的程序行为
  • 跟踪函数调用,了解函数的调用顺序和参数传递,理解复杂逻辑
  • 动态注入自定义代码到目标进程中,修改其行为或获取特定信息

反调试

多数 APP 做了反调试的防护,因此想要顺利调试,需要解决反反调试

案例:

  • 反调试:很多 APP 通过 ptrace 系统调用并传递 PT_DENY_ATTACH 参数,阻止其他进程(如调试器)附加到当前进程
  • 反反调试:通过 IDA Pro 将ptrace(PT_DENY_ATTACH, 0, 0, 0);对应的汇编代码修改为空指令,即可调试目标进程

评论

后继续评论需要管理员审核后可见

暂无评论,来发表第一条评论吧