入门 IOS 逆向从我的经历说起

2018-12-06 16:38:54 浏览数 (1)

本文作者:Peterpan0927(信安之路病毒分析小组成员 & IOSRE 版主)

在这里以讲故事的形式分享一下我踏入信息安全这条路的一些经历吧,希望能帮到一些人,正文开始:

计算机的启蒙

在高二的时候,我的一个好朋友突然神秘地交给我一本书:《C 语言入门经典》,并给了我一个拷贝好 VC6 的 U 盘,让我回去研究一下,特别有趣,当时我还是一个沉迷 LOL 的少年,回去翻看了实验了一下,几行不知道什么意思的英文单词经过操作之后居然可以在屏幕上打印出一段话,再之后接触循环,数组,觉得这个玩意有点意思,但当时还是处于一个高中生想装逼的想法去学习,所以很粗浅。

后来看到指针部分的时候,当时在午休,被班主任周老看到了,训斥了我一番,并告诉我让我好好准备高考,后来也就没看过了。从那之后直到我高考失利来到一个普通的一本,接触到了计算机这个专业,才开始重新拾起C语言这本书,其实后来回想起来,这本书对于我之后的选择也有一定的影响。

初入大学

玩乐了一个暑假后,和大部分同学一样,刚上大学的时候新奇地加入各种社团,上课玩游戏睡觉,业余约约妹子逛街,就这样度过了大一的上学期,因为当时进学校的分数应该是第一,所以我还一直愚蠢的得意洋洋,认为在学校没有比我更厉害的人。然而在寒假的时候突然觉得这样过日子好像和咸鱼也没什么分别,也许就是因为总是过分相信自己的天赋才会高考失利,继续这样下去可能只会碌碌无为一辈子,那一瞬间,我突然想拿起高中曾被我遗忘的那本书,与此同时,经过学长的介绍我了解到了 ACM (大学生程序设计大赛),从那时起开始真正的去敲程序,同时买了一本机械工业出版社的数据结构,虽然看的很吃力,但是还是一直看,其实当时走了很多弯路。

转折

从大一下学期开始,受到一个研究生学长的邀请,加入他创立的一个新的技术组,他在我入门的时候帮了我很多,第一次了解到终端和命令行,了解到了底层对于一个计算机人员的重要性,一学期内,我学习了 python 做一些小玩意并开始学习 iOS 开发,同时会看一些底层的书籍,如 《Linux Kernel Development》 和《图解 TCP/IP》 等,就这样每天玩玩学学,经历了外包和各方面知识的积累,我大概建立一个对于计算机体系朦胧的认知,不得不说这打的之前的基础对于我后来的学习尤为重要。

转眼来到大二上,当时由于网络安全周,学校需要组织一个队去参加一个信息安全的比赛,当时派了我的一个研究生学长,他捎上了我,当时我很兴奋并心虚,因为我对于安全方面一无所知,但学长说不要紧,还有十几天,先学吧。于是我硬着头皮学了一个月,踏上了赛场,令人鼓舞的是还拿到了一个省二,当时我记得还有武大的两只队伍,和我们是一个名次,后来联想起来,应该是别人的二队。

从这时开始,便和学长组队开始打 CTF 比赛,后来陆续也找了一些人,打了大概几个月,获得了一些成就,再后来因为毕业的缘故,队里就剩下了我一个,比赛打不下去了,又回去做老本行吧。

技术组当时买书买了一本叫做《iOS 应用逆向工程》的书,一直搞 iOS 开发的我突然来了兴趣,逆向还没玩过,之前打 CTF 的时候还没学汇编,Pwn 基本时别想了,我主要打的是 Misc 和 Crypto,这一看就入迷了,当时便买了个越狱手机来把玩,照着书上的教程 Hook 屏幕打印我 DIY 的话之后,仿佛想到了我高中第一次看到黑色屏幕上出现了 Hello world 一样震撼。

接下来就是跟着书一起实验,在 iOSRE 论坛上提问和大佬交流,并自己做了一些小东西,破解过一些简单的付费 app,心里还是有点小成就感,于是头脑发热去投了一个春招,当时也才大二下,只是抱着试试的心态,最后意外的加入了 360 的涅槃团队,这也是意外之喜,在实习期间,学习漏洞相关的知识,收获良多。

实习回来后,就是自己去看最新的文章,看源码,然后写分析,锻炼 poc 能力,学习各种花式的利用技巧,后来想要更加的拓宽自己的知识面,加入了信安之路的病毒分析小组

iOS 安全方向入门

对于这方面我的建议是先去学正向,正向都不会,逆向出来你也不知道他在干嘛,汇编和 C/C ,OS/网络是都要学好的,打好基础后面学习很快,下面推荐一些学习的书籍:

1、《iOS 应用逆向工程》:狗神的书,很棒

2、 《iOS 应用逆向与安全》:庆哥的新书,可以搭配着看

3、 汇编:王爽的汇编语言

4、 操作系统:和实际操作系统结合最好,linux 最方便,可以买个云服务器

5、 网络:《图解 http,TCP/IP》

6、 iOS 正向:基础不好的话可以去看黑马视频,配合项目练手,基础好的就直接看看书吧

iOS 逆向工具介绍

class-dump

这个工具从名字中我们大概也能猜出来这是一个去 dump 目标对象的 class 信息的工具。它利用的是 OC 的runtime特性,将存储于 Mach-O 文件中的头文件信息(@interface 和 @protocol 信息)提取出来,并生成的对应的 .h 文件。这个工具的用法比较简单,首先去官网:

http://stevenygard.com/projects/class-dump/

下载一个镜像,然后将 dmg 中的 class-dump 复制到 /usr/bin 目录下,然后给它赋予 777 的权限,运行之后就可以看到它的相关参数:

class-dump 的对象是 Mach-O 格式的二进制文件,如 Framwwork 的库文件和 App 的可执行文件。下面用 Mac 上的一个 ShadowsocksX 为例子:

这个时候我们已经通过 Xcode 的命令行工具 plutil 找到了这个 App 的可执行文件,但是并没有在本目录下找到,而是在其中一个子目录下面,接下来我们就可以使用 class-dump 去提取 App 的头文件了:

class-dump -s -S -H ShadowsocksX -o ~/path/to/headers/ShadowsocksX

接下来我们就会在目录下面找到我们所有的头文件了,经过对比之后,和源文件中的头文件是非常的相似的,除了一些参数类型被改成了 id,类型名用 arg1,arg2 来表示之外,其他的基本都是一样的。通过这些头文件,那么闭源的 App 就会露出他们的马脚了

Theos

这是一个越狱开发工具包。它与其他的越狱开发工具相比,最大的特点就是简单:不管是下载安装还是 Logos 的语法还是编译发布都比较省事,既然比较起来就要提到另一个也就是整合在 Xcode中 的 iOSOpenDev,作为一个经常使用 Xcode 的 iOS 工程师,本来我是打算使用这种工具的,但是逆向工程接触底层的知识比较多,很多东西无法自动化,工具太智能反而会坏了自己的根基,所以选择了整合度不算太高的 Theos。

等到配置完成之后就可以开始创建工程了,启动NIC:

/opt/theos/nic.pl

然后根据选项我们创建一个 Tweak 工程,然后按照要求输入一系列的参数,也就算是我们的一个基础的 Tweak 工程创建完毕了,接下来还是结合实例来讲一下比较形象一点,我是在手机上修改了锁屏界面,也就是会进行弹窗,那么我们看看整个流程应该如何的去操作:

首先修改我们的 MakeFile,这个文件中指定工程用到的所有文件、框架、库等,将整个过程自动化

接下来要修改的就是我们的 Tweak 文件:

这个 Tweak 也只是一个 demo,显然也非常的简单,意思也就是说勾住 SpringBoard 类中的applicationDidFinishLaunching:函数,然后执行其中我们重写的 OC 语句,也就是弹出一个框,这两部做完之后剩下的就是打包然后编译安装了,在这个地方我们最快捷的一条龙服务就只需要一个命令:

make package install

CydiaSubstrate

曾几何时,在我们编写 Tweak 的时候,有没有考虑到它正常运行的基础是什么呢?正如我们在写编译型语言的时候,会知道编译器作为我们程序正常运行的基础,在写诸如 python 的解释型语言的时候,会知道有解释器作为我们的基础,那么 Tweak 之所以可以改变我们正常进程运行的基础就是 CydiaSubstrate。它由三个部分来构成:

1、MobileHooker

2、MobileLoader

3、Safe Mode

下面我们就来一个个的阐述他们为 Tweak 的正常执行和维护起了什么样的作用:

1、MobileHooker

用图来说明 Hook 的功能

2、MobileLoader

该组件的作用就是让应用程序加载第三方的 dylib,theos 工程编译后生成的 dylib 就是由这个 MobileLoader 来加载。

MobileLoader 的原理主要是在系统启动时由 launchd 进程将 MobileLoader 加载进内存,随后 MobileLoader 会利用 DYLD_INSERT_LIBRARIES 环境变量将自己加载进设备的各个进程中,并会遍历/Library/MobileSubstrate/DynamicLibraries/目录下的文件,根据和每个 dylib 同名的 plist 文件来确定该 dylib 的作用范围,若当前进程满足该作用范围,则会使用 dlopen 函数动态加载对应的 dylib。

比如我们来查看一下 WatchDog 的 plist 文件:

这其中的 string 指定的是SpringBoard的 bundle identifier,也就是说进程 SpringBoard 会加载这个 dylib,值得注意的是,MobileLoader 加载完每个 dylib 后会首先调用 dylib 中用 __attribute__((constructor))声明的入口函数。

3、Safe Mode

顾名思义安全模式是为了保护我们的手机,我们的程序总会有崩溃的时候,因为 Tweak 的本质就是 dylib,崩溃的时候就会导致整个进程都崩溃掉,昨天我在写代码的时候不小心多了一个release,导致访问未知内存,整个 Tweak 都 crash 掉了,更要命的是,这个 dylib 是寄生在 SpringBoard 上的,所以整个 iphone 的界面也崩掉了。

这个时候系统就会提示进入安全模式,让我们重启 SpringBoard,在安全模式下,所有基于 CydiaSubstrate 的第三方 dylib 都会被禁用,等到修复完成之后,就可以继续使用了。它会捕获SUGTRAPSIGILL等六种信号作为判断是否进入安全模式的条件。有时候安全模式也不顶用的时候,就需要我们硬重启,然后按住音量 禁用 CydiaSubstrate,等到修复之后再重启一次就可以重新启用。

IDA Pro

这个就不用过度说明了,全平台逆向神器

博客和 github 地址

Blog :

https://peterpan980927.cn/

Github:

https://github.com/Peterpan0927/

0 人点赞