内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

iOS逆向基础Hopper+LLDB调试(四)

2018-06-08 18:31 出处:清屏网 人气: 评论(0

这篇文章已经在公号后台躺了将近一月,趁着这俩天空,把这个坑填起来,本篇主要内容为基于Hopper+LLDB在运行时调试,修改寄存器值,修改MachO二进制实现逻辑业务判断绕过,以某云课堂为例:

如上图未加入学习(付费),点击下载按钮,会提示课程加入学习后才可下载,那么怎样才可以绕过这个判断,直接进入下载页面呢?好了接下来我们带着这个问题,一步步分析。

首先我们以MD或IPAPatch动态调试已解密的IPA包,发现这个详情页的控制器为YKTMCourseDetailController,拿到这个后在Hopper里搜索

可以发现YKTMCourseDetailController有一个方法handleDownloadPick,只有这一个含有下载关键词(可见加固对于混淆类名方法名的重要性),为了验证是不是该方法,我们使用LLDB对这个方法的起始地址0x0000000100266e34

下断点,当然这个地址并非APP载入内存的实际逻辑地址,接下来我们通过Hopper 的Rebase操作将地址替换为内存实际逻辑地址。

使用 image list -o -f获得偏移地址ADLR(0x0000000000758000),Hopper查看Arm64基地址为0x100000000,根据公式求和,使用Mac可编程计算器可以算出程序运行时内存基址为0x100758000。

(lldb) image list -o -f

[  0] 0x0000000000758000 /Users/apple/Library/Developer/Xcode/DerivedData/IPAPatch-gkuywwzsubpjtqbhgmofkdtztdeb/Build/Products/Debug-iphoneos/iOSTips.app/Edu901iPhone

模块偏移后的基地址(0x100758000)= ASLR偏移量(0x0000000000758000)+ 模块偏移前基地址(0x100000000)

我们验证下算出的地址是否是对应的准确地址,使用memory read 0x100758000可查看到如下内容:

对比可发现这个值cf fa ed fe (MH_MAGIC_64)和Hopper里完全相同,稳稳的,这个地址算对了。

这里不多讲 ASLR, 需要了解的同学自行Google之,接下来为了后续调试方便免于每次手动计算真实内存地址,我们把刚算出的运行时基址0x100758000在Hopper中使用Modify->Change File Base Address,做rebase操作如下图:

rebase后可见handleDownloadPick的地址已经由0x0000000100266e34变为00000001009bee34,这个地址对应目前App运行真实逻辑内存地址,好了rebase后,我们回到上边的思路继续逆向分析。

我们还是使用LLDB:br对handleDownloadPick:0x00000001009bee34下断点,如下添加断点,然后继续运行App,点击下载按钮。

果然程序被断下来了,对比可发现这段汇编代码和Hopper里代码一模一样,稳稳的。

接下来我们先看下handleDownloadPick的反汇编伪代码,以及控制流图,可知在方法内先判断了是否登录,是否已加入学习,如果条件都为真,则进入下载页面。

我们继续查看控制流图,可以发现在0x1009bee74处通过cbz指令(条件为0跳转指令)可进入已登录,未登录分支,在0x1009beed4处通过cbz指令可进入已加入学习,未加入学习分支。

接下来我们在这0x1009beed4处,添加断点,继续运行后,停在该处(cbz w24,0x1009befe4),通过LLDB查看w24寄存器值: p/x $w24,明显这里的值为0,然后我们通过修改寄存器值,cbz( 为0跳转指令 ,查看ARM64官方文档可知),那么我们只要改为非0就会继续运行了,这里使用 register write w24 1。

当我们修改程序后继续运行,果然直接来到了下载页面,稳稳的,已经成功绕过付费判断进入下载页。

既然我们分析的没错,那么我们直接修改二进制文件0x1009beed4地址处,使用HopperModify->Nop region将CBZ替换为空指令如下图,也可以使用Window->Show Hexadecimal Editor直接编辑十六进制文件,最后File->Produce New Executable导出修改后的文件,替换原始可执行文件,运行验证,稳稳的绕过。到这里,使用Hopper + LLDB 逆向就完成了。(在公众号后台留言[Hooper]即可获得破解版下载地址,试用版只可以反编译无法修改汇编代码,也无法保存)

可见我们应用内核心业务有必要做混淆,比如使用OLLVM,控制流平展Control Flow Flattening),指令替换(Instructions Substitution),控制流伪造(Bogus Control Flow),增加逻辑跳转复杂性,迷惑性,提高逆向分析的难度。

最后这里挖一个坑,后边来填,我们可以看到上文图中macho flag值为0x218085,然后我们使用MachOview查看可见00200000 MH_PIE字段(ASLR偏移开启标志位),观察这个flag值可知,各个标志位相加即为flag值,那么去掉ASLR,很简单,把flag改为0x18085是否可行?

这里推荐几本安全攻防的电子书,公众号后台回复[安全攻防]即可获得下载链接,另外回复[Hopper]即可获得破解版,有效期只有一周哦。

附相关资料


分享给小伙伴们:
本文标签: HopperLLDBiOS逆向

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号