iOS 安全与逆向基础
本文介绍 iOS 安全与逆向工程的基础知识,包括 iOS 越狱原理与工具、砸壳技术、静态分析和动态调试等核心概念,为 iOS 安全研究提供入门指导。
iOS 越狱
常用越狱工具
- palera1n: 支持 iOS 17
- checkra1n: 支持 iOS 12 到 14
- unc0ver: 支持 iOS 11 到 14
上述工具的使用方法:
- 通过连接电脑或 IPA 包将越狱工具安装到设备上,打开工具并点击"Jailbreak"按钮,设备重启后完成越狱。
利用的漏洞:
- palera1n 和 checkra1n 利用硬件层面漏洞(checkm8 bootrom 漏洞,存在于 A7 到 A11 芯片),无法通过软件更新和修复
- unc0ver 利用软件层面漏洞,可通过软件更新修复。unc0ver 是半不完美越狱工具,每次设备重启后需要重新激活越狱
可能的软件漏洞包括:
- 反序列化: 攻击者构造特定的、包含恶意代码的序列化数据,通过网络请求等途径传递给目标程序,目标程序进行反序列化时就会执行恶意代码。
- 内存溢出:攻击者通过内存溢出覆盖程序的控制流,执行其注入的恶意代码。
越狱工具原理
- 利用漏洞(内核漏洞、沙盒逃逸等)获取系统的高权限
- 进一步提权,获取 root 权限,将文件系统从只读更改为可读写
- 在设备上安装越狱管理器来安装各种越狱插件和应用
- 修改启动文件,安装启动守护进程,以在设备重启后保持越狱状态
- 修改系统文件和进程,防止被安全软件检测
越狱种类
根据越狱效果分以下几种:
- 完美越狱(Untethered Jailbreak):设备重启后,越狱状态保留,无需再次越狱
- 半完美越狱(Semi-Tethered Jailbreak):设备重启后,越狱状态丢失,但只要在设备上执行某些操作即可恢复越狱
- 不完美越狱(Tethered Jailbreak):设备重启后,越狱状态丢失,需要连接电脑使用越狱工具引导开机并再次执行越狱操作
- 半不完美越狱(Semi-Untethered Jailbreak):设备重启后,越狱状态丢失,需要连接电脑再次执行越狱操作
现在主要的越狱类型是半不完美越狱和不完美越狱。
越狱状态
- 恢复到越狱之前状态:重启,或者再次使用越狱工具来恢复
- 查看设备是否越狱:安装 爱思助手
越狱检测
- 检查越狱应用和文件:例如/Applications/Cydia.app、/usr/sbin/sshd 等,如果存在则说明越狱
- 检查目录读写权限:程序沙盒目录之外的目录应该是不可写的,如果可写则说明越狱
- 检查系统或私有 API: 有些系统 api(例如 sysctl)或者私有 api(例如 fork)在非越狱设备上不可调用,如果调用成功说明越狱
- 检查动态链接库:某些动态库(如 Frida)在越狱设备上会被使用,如果这些库存在则说明越狱
- 检查可疑环境变量:例如 DYLD_INSERT_LIBRARIES
反越狱检测
- 隐藏越狱文件和目录
- 修改系统 API 的返回值,欺骗检测程序
- 注入自定义动态库,例如使用 Frida 来注入 JavaScript 脚本,修改应用程序的行为
反反越狱检测
- 综合使用多种方式,增加绕过检测的难度
- 结合 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 应用程序的工具,用于生成未加密的可执行文件
砸壳步骤
- 将需要砸壳的应用程序和砸壳工具(例如 Frida、Clutch 等)安装到越狱设备上
- 执行砸壳工具的命令,砸壳工具会从内存中获取未加密的二进制文件,并保存到设备
- 将未加密的二进制文件传输到电脑,并使用逆向工具(例如 IDA Pro、Hopper Disassembler 等)进行分析,查看和修改代码
静态分析
静态分析是指在不运行目标应用程序的情况下,分析其二进制文件、代码结构和资源,理解应用程序的行为和逻辑。
常用的反汇编、反编译工具
- IDA Pro: 提供强大的反汇编、静态分析和调试功能,并支持插件扩展和脚本自动化
- Hopper Disassembler: 提供反汇编和反编译功能,支持多种架构,并具有用户友好的图形界面和脚本支持
静态分析步骤
- 通过“砸壳”获取目标应用程序的二进制
- 使用反汇编工具将二进制文件转换为汇编代码,使用反编译工具将汇编代码转换为更高级别的伪代码
使用静态分析工具,我们可以:
- 分析应用程序的代码结构,包括函数、方法、类和模块之间的关系,识别关键函数和方法,了解它们的调用关系和参数
- 提取应用程序中的字符串和其他资源,如图片、配置文件等,提供有关应用程序功能和逻辑的线索
- 尝试恢复应用程序中的符号信息,如函数名和变量名,这些符号信息可以极大地帮助理解代码逻辑
- 生成控制流图(CFG)和数据流图(DFG),帮助理解代码的执行路径和数据传递,直观地展示代码的逻辑结构和依赖关系
静态分析的局限性:
- 一些应用程序可能使用代码混淆和加密技术,增加静态分析的难度
- 静态分析无法获取运行时的动态行为和数据,可能会错过一些依赖于特定输入或环境的逻辑
动态调试
可以弥补这些局限性。
动态调试
动态调试是指在应用程序运行时对其进行分析和修改,理解应用程序的行为和逻辑。
常用的动态调试工具
- LLDB:Xcode 自带的调试器,支持 iOS 应用程序的动态调试,可以设置断点、检查内存、跟踪函数调用等
- Frida:一个动态分析和代码注入工具,允许在运行时修改应用程序行为、拦截函数调用和进行内存操作
动态调试步骤
- 通过“砸壳”获取目标应用程序的二进制,重新签名并安装到越狱设备上
- 将必要的调试工具(例如 LLDB、Frida 等)安装到越狱设备上
- 使用调试器附加到目标应用程序的进程,以便监控和控制其执行。 例如在 LLDB 中,可以使用 attach 命令附加到正在运行的进程
使用动态调试工具,我们可以:
- 在感兴趣的函数或代码位置设置断点,允许调试器进行检查和修改
- 修改内存中的数据,以观察不同的程序行为
- 跟踪函数调用,了解函数的调用顺序和参数传递,理解复杂逻辑
- 动态注入自定义代码到目标进程中,修改其行为或获取特定信息
反调试
多数 APP 做了反调试的防护,因此想要顺利调试,需要解决反反调试
。
案例:
- 反调试:很多 APP 通过
ptrace
系统调用并传递PT_DENY_ATTACH
参数,阻止其他进程(如调试器)附加到当前进程 - 反反调试:通过 IDA Pro 将
ptrace(PT_DENY_ATTACH, 0, 0, 0);
对应的汇编代码修改为空指令,即可调试目标进程
评论
暂无评论,来发表第一条评论吧