XX同学让我就iOS动态分析做个分享,但我觉得自己还只是一点点开窍而已,所以就把学到的东西总结一下,欢迎拍砖!
学习iOS动态分析,首先需要对objective-c的基本语法有一些了解,这个google学习下吧。
接下来重新学习了一遍这个课程里面的Cycript和GDB的教程,感觉比之前更深入一点。
我对二者的理解是:
Cycript既然是javascript的一个变种,应该主要也是作用于View和Controller这一层,适用于篡改一些界面上的元素属性或者是方法,比如把本该无权限显示的view改成可以显示,暴露不该暴露的信息。
GDB感觉会更深入一点,可以通过设置断点,读取或篡改寄存器的值,比如读取用户的密码等confidential的信息,而这些信息只是后台使用,不大会显示在view上面。
对产品的分析:
如果产品是CS的结构(目前应该大部分都是这样),client与server之间的交互需要通过身份验证,因此,即使我们通过一些手段绕过了登陆的界面,后续的信息也需要通过身份验证才能够获取。所以绕过login不是关键,关键是如何才能在用户登录后,获取到用户的身份验证信息,比如用户名,密码等。可以试试用GDB获取寄存器信息的方式。不过我还没尝试过,只是纸上谈兵。
当然如果没有严密的server校验,想办法绕过登陆界面就会比较有用。
另外,功能里面分角色,不同角色有不同的权限,client根据权限的不同会显示不同的UI。这样,我们就可以用Cycript来改改看,让本不该没有权限的人看到的东西显示出来。
使用GDB和Cycript分析的思路和实例:
前文说了,我只是一点点开窍而已,所以只能把网上学到和简单实践的东西总结一下,很多用法和实践还不清楚。
GDB:
总结下使用GDB进行运行时分析和操作数据的过程:
1. 首先,要从class
dump或者源码中先找到一个敏感信息的攻击目标,比如login相关的方法
2. 为此方法设置断点
>break 方法名:
>c
3. 接下来通过客户端操作来触发被设置断点的方法
4. disas命令查看接下来要执行的指令,从结果中分析是否有其他敏感的方法名,以及objc_msgSend即blx出现的地址
5. 为每一个blx设置断点,查看接收信息的类和方法,查看敏感的方法,并进一步获得$r2的值,甚至篡改值
>po $r2
>set $r0
PS:详细内容可以参照上面课程的第21、22章
实例~~:我还没有针对我们的client实践成功过,等再开窍了再补吧
Cycript:
1. 首先操作client到你想要的界面
2. 通过Cycript命令获取当前界面的viewController,从结果可以知道当前的类
3. 很庆幸,有源码!去源码里面搜索这个类,看看它都有一些什么属性和方法
4. 如果很幸运发现了可能存在漏洞的属性和方法,就去改改看。对于我这样的菜鸟来说,最简单的莫过于参数为bool类型或者返回值为bool类型的方法了。改一下true或false,可能发现UI就变化了,幸运的话,还可能显示了不该显示的东西
实例:
昨天改了一个控制list显示的东东,分享一下
场景:
用户当前没有权限显示list,但是通过下面的方式操作,变成可以显示:
#cycript
-p PROCESS_ID
//获取当前界面的viewController
cy#
var rootController = UIApp.keyWindow.rootViewController
cy#
var visibleController = rootController.visibleViewController
//然后得到当前的viewController的类
//到源代码里面搜索类名,看看这个类里面有没有可以篡改的有意义的信息。上面说了,菜鸟就从返回值是bool类型或者参数是bool类型的开始看吧。
发现了一个方法 参数为bool类型,使用objc的语法调用这个方法,并塞入参数为false
cy#[visibleController Method:false]
//ok,本不该显示的东东显示出来了。也就是说,通过篡改运行时状态,把本不该具有权限查看list变成了有权限。
看起来挺简单的吧。相信高手肯定能找到更多的突破口。
说完如何动态分析的思路和方法,最重要的目的是如何来防护。虽然黑客不像我们能看到源代码,但是也能无障碍读取没有任何保护的头文件信息,对一目了然的属性和方法进行为所欲为的操作。对我们来说,虽然没有一劳永逸的解决方案,但是总是可以做一些事情来增加黑客破解的难度,简单说就是制造麻烦,让那些junior的或者急性子的黑客知难而退。
防护:
1.检测设备是否越狱
http://blog.csdn.net/yiyaaixuexi/article/details/20286929
2. 阻止GDB/LLDB
debug http://resources.infosecinstitute.com/ios-application-security-part-23-defending-runtime-analysis-manipulation/#article
3. 代码混淆
http://blog.csdn.net/yiyaaixuexi/article/details/29201699
说起代码混淆,也挺有意思一件事。起初我以为就是把那些一目了然的名字改成连自己看了都不知道是干啥的东西,比如login改成abc。所以就困惑了,那代码怎么写,怎么理解啊!自己都不知道这是干啥的。看了上面这个文章才知道原来有更高级的方式。虽然我没试过是否可行,不过还是打消了我之前的顾虑。
4. 敏感业务逻辑的代码用C来写 http://blog.csdn.net/yiyaaixuexi/article/details/29210413
好记性不如烂笔头,尤其是我这个年纪的女人,汗!希望大家能看得懂。如果有一点帮助,就撒花鼓励一下,哈哈。