本帖最后由 进击的雪初音 于 2018-3-23 10:31 编辑
首先声明我是个小白,前段时间还在研究安卓逆向呢,迫于工作需要才学了一点ios逆向,参考了网上大牛的文章,老实说他们对小白并不友好,很多都没法解释为啥那么做,因此里面有一些我自己的理解,写的很细。如果理解错了还请大佬指正。由于太细了贴图太麻烦就不贴图了 ,最后我把文章也放到百度云盘里包含工具和命令,大家可以直接下文章看
一、背景有时候渗透测试ios版应用的时候,客户直接说要测的应用已经发布在App Store上了,让我直接在App Store上下载测试,并不会直接给我未发布版的。当我们需要针对某个漏洞进行代码审计的时候就会遇到一个麻烦:有壳。我们知道在App Store上下载的应用都是带壳的,不信我们可以测试下。
我们知道ios应用在装入手机的时候产生的沙盒(沙盒里面包含数据库、内存等运行环境资源)和应用本身的资源(其实就是ios安装包解压之后的文件夹)是分开的。沙盒存放的位置是:/var/mobile/Containers/Data/Application/xxxxxxxxxxxxxxxxxxxx/Documents。这个xxx的命名不是我们决定的,因此如果要手工去找这样的文件夹是很烦的,后面我们会利用cycript工具来查找这样的文件。同样应用本身资源则是存放在/var/mobile/Containers/Bundle/Application/yyyyyyyyyyyyy/WeChat.app文件中,注意我们这里的y和上文的x是两个不同的文件夹。因此我们可以用ps -e这样的命令来查看这个的文件夹。幸运的是现在大多数的苹果手机助手都能很好的识别这个文件夹,如下图(我用的是i4助手):
我们要找的可执行文件就在这个文件夹里面,我们可以直接导出整个微信文件夹
至于我们要找的加壳的可执行文件,根据以往经验应该与微信文件夹同名即wechat。
你也可以不根据经验,用ios下的plutil工具解析该应用的配置文件info.plist来查看里面的CFBundleExecutable项来查看它的可执行文件
利用命令plutil -p info.plist查看这个文件(因为这个文件是编译过的,因此肯定要借助特殊的反编译工具才能擦好看plist文件)
我们要逆向的文件就是这个,一般情况下未加密的头文件是能够导出头文件的,用的工具是class-dump,命令测试如下:
但dump出来的只有一个头文件
一般的头文件有很多,如下图:
将wechat文件放入IDA中也是会显示他加过密的,如下图:
通过上面的证明就能看出从appstore上下的文件都加过壳的。那么要怎么脱壳呢?万幸的是由于ios系统的加壳单一,网上早有了破壳用的锤子,这个锤子就是dumpdecryted,需要编译,由于这个锤子一旦编译好就能一劳永逸重复使用,因此我找的是直接编译好的,如下图(编译好的后缀是dylib,就是链接库的意思):
二、破壳步骤 1、打开ssh,获取微信应用的PID 不同于Android端使用adb来进行丰富的调试,IOS端则是以ssh的方式来连接。打开ssh原因是我们想在里面执行查看命令和使用dumpdecrypted的命令,打开方式很简单,借助i4助手的打开ssh功能就行了
用ssh工具进行连接就能链接了,我使用的是SecureCRT,如下图:
输入用户名和密码就能进入内核,执行命令了
我们接下来执行的命令是ps -e 目的是为了获取微信进程的进程号,从而能通过cycript这样的工具查找出微信应用的进程目录或者说是沙箱目录,这里就会自然而然的想得到一个问题了,既然是进程目录,那么一定要有进程,因此微信程序必须打开。因此我们先打开微信。
然后ssh里输入ps -e这样一条命令
微信本身内容很好找,记得之前说过的沙盒路径吗?找这个就行了/var/mobile/Containers/Bundle/Application/yyyyyyyyyyyyy/WeChat.app,找到如下图所示:
我们主要目的就是找到进程号,这个进程号会是cycript -p命令之后的参数用来确切的寻找到微信的沙盒文件夹,cycript是一款越狱苹果手机里cydia商店里的一个应用,用于对苹果应用进行调试、注入等(不知道这样理解对不对)。首先你必须先在cydia商店里安装这个应用。如下图:
输入cycript -p 注入进程号(这里具体情况具体分析,我这里的进程号是38172)如下图:
出现cy标志的时候说明cy程序已经注入进来了,但为什么没有出现沙盒路径呢?cy是一个编程调试工具,你必须得下具体的命令指定他输出沙盒的文件形式才行。 沙盒文件形式的代码是固定,我这里贴出,大家可以直接粘贴 [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0] 代码执行如下图:
接下来就简单了 2、拷贝dumpdecrypted.dylb进沙盒,然后执行dumpdecrypted脚本。 首先根据沙盒路径将dumpdecrypted考进沙盒目录里,可以用命令也可以直接用i4助手,这里我直接用i4助手了
用ssh赋予执行权限(退出cydiia的方法是ctrl+d):
接下来就是怎么使用这个文件了,命令是: DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib [可执行文件路径 这里还会有一个疑问,那就是程序的可执行文件wechat是在应用程序本身里的而不是在沙盒目录里,为什么我们需要在沙盒目录里执行呢?嗯。。。怎么说呢简单点理解我要脱壳一定是要在运行这个壳的环境里运行吧,而程序安装包的那个文件夹并不满足这个条件,因此必须在沙盒里运行,否则运行不成功 运行具体命令如下: DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/4D1C92F3-5381-4599-9301-2C58F3BED538/WeChat.app/WeChat
有点小,可以放大,这时候脱壳之后的文件wechat.decrypt文件就存放在根目录下了,如下图导出即可。
这个就是脱壳后的文件,这里还有最后一个问题,就是class-dump的使用问题。就像我上面说的他是通过动态运行进行脱的,因此只脱取了该手机架构的那部分壳,其他部分还是没有脱的,因此在使用class-dump的时候必须指定手机架构,否则使用的时候会跟原来的壳一样。
因此使用class-dump命令是制定armv7s的壳,如下: class-dump --arch armv7 WeChat.decrypted -H -o 输出文件夹
三、总结 因为自己是小白所以遇到了很多问题,研究了半天,跟网上的大牛教程比起来,可能太啰嗦了,相较于Android加壳厂商的多样化以及加壳方式的五花八门,ios的加壳和脱壳反而容易很多。
|