IOS终端安全(7) – 使用lldb动态调试IOS终端应用

一、动态调试需要工具:

1.Disassembler : mac下静态分析工具,主要用来获取函数偏移地址,汇编操作

2.MonkeyDev中的class-dump开启,dump砸壳后的函数信息

3.一台越狱的IOS

4.MacOs自带的lldb,用来发送指令给IOS的debugserver,动态进行调试。

当手机设备连接到 Mac 进行真机调试的时候,debugserver会被安装到IOS的 /Developer/usr/bin 目录下。但是,debugserver 默认只能对自己开发的 App 进行调试,要想动态调试其他 App,还需要进行简单的修改,具体修改如下

开始:

越狱后的手机连接电脑后,使用ssh 或者爱思助手连接登陆苹果手机,登陆后,进入/Developer/usr/bin 目录,查看是否存在debugserver可执行文件,

然后使用scp命令复制到桌面

scp [email protected]:/Developer/usr/bin/debugserver ./

然后给debugserver文件赋权,新建文件 entitlements.plist

touch entitlements.plist

内容如下:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>com.apple.springboard.debugapplications</key>
        <true/>
        <key>get-task-allow</key>
        <true/>
        <key>task_for_pid-allow</key>
        <true/>
        <key>run-unsigned-code</key>
        <true/>
</dict>
</plist>

使用 codesign 进行签名:

codesign -s - --entitlements entitlements.plist -f ./debugserver

然后把赋权后的debugserver 放到手机的 /usr/bin 目录下,

scp debugserver [email protected]:/usr/bin/

之后就可以直接用来动态调试IOS手机应用,具体调试过程如下:(以公司外卖应用为例子)

从Appstore上下载好之后,使用CrackerXI+砸壳,砸完壳之后,把对应的ipa文件和二进制文件复制到桌面

scp -r [email protected]:/var/mobile/Documents/CrackerXI ./Desktop

打开xcode,新建MonkeyApp项目,

然后按照前面文章说的,把砸壳后的app丢进monkeyDev里,并开启class-dump功能,然后安装到手机里。

之后就可获取到对应的class-dump文件了。

下面来调试登陆,界面如下

首先通过 class-dump下来的文件,我们找到登陆相关的函数和变量,例如查找password关键字。

通过sublime全局搜索,看到这几个关键字,差不多就是登陆函数了,然后我们在PDloginVModel.h文件中查看具体申明的变量,函数信息。

打开PDloginVModel.h文件后,发现就一个接口和一个cxx_destruct方法,cxx_destruct这个方法多数就是处理参数变量传给服务器,然后验证账号密码是否正确。

接下来,我们打开Disassembler,将从手机里复制出来的二进制文件丢进去静态分析

稍等片刻等待Disassembler处理完后,即Disassembler右下角的Working….消失。

Disassembler在Labels里搜索PDLoginVModel,可以发现,各个变量名称和cxx_destruct的具体偏移量

之后,通过注入进程调试这个函数,找出实际的内存地址,下断点。

打开手机上使用MonkeyDev安装的app应用,然后使用ssh登陆上ios手机,找出app的进程

ssh [email protected]
ps -ef |grep PandaDelivery

找到进程后,开启debugserver等待调试,在苹果终端的命令行里执行

debugserver 0.0.0.0:2333 -a 2610

此时应用程序会卡住,等待远程lldb连接调试,使用command+t,新开一个命令行窗口,输入lldb,在lldb环境里,输入连接手机命令

process connect connect://10.1.4.181:2333

连接成功后会提示如下

目前app应用是暂停状态,输入 c继续让终端进程运行。

此刻我们需要获取到终端应用程序的运行时的基地址,在lldb中执行如下命令

(lldb) image list -o -f "PandaDelivery"

得到的基地址

基地址加上要断点的函数偏移量地址,即可得到函数在内存中实际的运行地址,也就是0x0000000002cd0000+cxx_destruct偏移地址,在lldb中执行如下命令

breakpoint s -a 0x0000000002cd0000+0x0000000100110a68

我们的断点打在了0x0000000102de0a68地址,也就是cxx_destruct函数内存运行的实际地址,此刻我们在手机app登陆页面输入账号密码,然后点击登陆,此刻我们看到运行的app卡住了,因为运行到了我们的断点处了。lldb显示如下

然后在lldb中使用po 命令打印出寄存器的值:

可以看到账号,国家码,密码信息,

更多的lldb使用和动态调试找出应用签名的key,后续继续….

下特么的班班。

End。