使用IDA+LLDB+RetSync调试iOS

使用IDA+LLDB+RetSync调试iOS

前言

  安全行业可大致分为网络安全和二进制安全,二进制安全按层次可分为系统安全,软件安全,框架安全和硬件安全,如果按平台分类又可分为Windows安全,Android安全,iOS安全等。网络安全主要是利用已知漏洞进行扫描,依赖于内核漏洞和常用软件漏洞。在二进制分析中,需要用到静态分析工具,动态调试工具,跟踪工具及其他工具。静态分析和动态跟踪是相辅相成的,因为二进制通常比较大,所以要结合动态分析找到关键点,而动态调试可能会因为有反调试反跟踪技术失败,此时需要静态分析去除并修改二进制或进行注入Hook来绕过检测。动态调试是基于指令级别的,一般情况下效率较低,此时需要进行函数级别的跟踪则需要用到跟踪工具或注入Hook

  • 静态分析. IDAPro, Hopper, Ghidra, BinaryNinja, BinNavi, Radare, Capstone, RetDec等, 这些工具主要针对编译型语言,而解释性语言都有自己专用工具如Jadx, JEB, dnSpy
  • 动态调试. WinDbg, OllyDbg, X64Dbg, GDB, LLDB, Unicorn等
  • 跟踪工具. DynamicRIO, IntelPin, Frida等

  笔者常用工具集组合为IDAPro + LLDB + Frida,这是在MacOS上进行iOS二进制分析的最小工具集。当然很多人因为搞不定IDAPro的"BUG"或者觉得无法显示高级语法或其他奇奇怪怪的原因而转去用Hopper,这是Hopper存在一定用户的原因。而LLDB则是远程调试iOS的唯一选择。为什么iOS要进行远程调试而不是本地调试呢(即直接在iOS上调试)?其实早期确实有iOS版的gdb能进行调试,但因为设备环境的局限性,这种方式比较低效,而MacOS上则有极其丰富的工具可选,所以最佳方案就是在MacOS上远程调试iOS。MacOS上最佳静态分析工具依然是IDA,但IDA的iOS远程调试套件功能较差,但LLDB调试功能较强,如何结合IDA和LLDB呢?这就是ret-synchttps://github.com/bootleg/ret-sync,ret-sync通过自建通信协议,将调试器的状态同步给静态分析工具,从而实现联合调试。ret-sync支持:IDA/Ghidra/BinaryNinja/WinDbg/GDB/LLDB/OllyDbg/X64Dbg.

使用

  关于IDA+LLDB+ret-sync联合调试iOS的相关文章,笔者曾在2021年在简书上简略分享过,这里重新详细介绍一下。

  1. 安装ret-sync到IDAPro和LLDB. 需要确定IDAPro/LLDB自带Python的位置,LLDB可以执行script import sys;print(sys.version);print(sys.path).
git clone https://github.com/bootleg/ret-sync.git
cd ret-sync
cp -rfp ext_ida/* /Applications/IDAPro/ida.app/Contents/MacOS/plugins/
cp -rfp ext_lldb/* /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python/
# 将rsconfig.py中的PY_LINUX_DEFAULTS设置为正确的Python路径
  1. 配置ret-sync到IDAPro和LLDB
  • LLDB. command script import sync
  • IDAPro. Plugins -> ret-sync
  1. 调试
  • LLDB启动远程调试,并断在目标模块中,IDA静态分析目标模块
  • LLDB执行sync命令
  • IDAPro中同步,此时可以看到LLDB将当前指令同步给IDA,同时IDA下断点也同步给LLDB