美文网首页
六、iOS逆向之《LLDB高级用法&Cycript》

六、iOS逆向之《LLDB高级用法&Cycript》

作者: Hanfank | 来源:发表于2019-01-02 21:53 被阅读62次

    前言

    上节文章讲解了一些lldb的常用命令,这篇文章我们来讲解一些lldb的高级用法。

    一、ASLR

    ASLR概述

    ASLR是一种针对缓冲区溢出安全保护技术,通过对、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。
    ASLR(Address space layout randomization)是一种针对缓冲区溢出安全保护技术,通过对、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今LinuxFreeBSDWindows等主流操作系统都已采用了该技术。

    简而言之:为了安全,内存中,程序文件的地址要偏移,而偏移量则是ASLR偏移,偏移量的多少是随机的,每次程序进程退出后,偏移量又会改变。

    理解ASLR这个概念之后可以做点什么?

    举个例子:
    我通过一些工具可以直接查看到Mach-O的方法地址,通过这个地址我们可以在这个地址打个断点,但是打断点时发现断点失败,或者断点位置根本不是我们想要的地方。这时我们可以考虑是因为ASLR偏移量的缘故。
    通过Hopper工具查看自定义方法eat:方法在内存中的地址。

    Hopper工具查看内存地址(图中其它东西我们暂时不去看,只关注我们关注的)

    图中eat:是我自定义的方法,假设这是我在别人的Mach-O文件中找到的方法,想在此打断点。尝试一下通过给eat:地址打断点。可以看到图中是失败了。

    尝试打个断点

    那么如何才能给eat:打到断点?
    我们可以通过这个公式获取断点地址:基地址+方法地址=断点地址

    通过lldb输入image list指令找到.app在内存中的起始地址0x000000010a79d000

    (lldb) image list
    [  0] E095A052-7594-3646-841E-7056F36306D0 0x000000010a79d000 /Users/chian/Library/Developer/Xcode/DerivedData/LLDB-culbvnuqlgmqubfafrwfnblamkly/Build/Products/Debug-iphonesimulator/LLDB.app/LLDB 
    [  1] 289AB27E-F09F-3384-A14A-100431139559 0x000000011a2ee000 /usr/lib/dyld 
    [  2] C3514384-926E-3813-BF0C-69FFC704E283 0x000000010a7a9000 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/dyld_sim 
    ...
    
    

    再拿到之前图中定位好的eat:方法的地址0000000100001570
    由于64位的Mach-O文件中还有一个PAGEZREO大小的空间偏移,而基地址eat方法都加了PAGEZREO的空间偏移,那不能两个都加啊~,删掉eat:地址的PAGEZREO就得到了0000000000001570.

    0x000000010a79d000+0000000000001570相加就可以得到真实地址

    成功打了个断点

    成功了!

    二、Chisel工具

    Chisel概述

    其实lldb给开发者提供了很多接口自定义指令,Chisel工具就是其中之一。
    它可以打印当前页面的所有视图层级结构,也可以打印当前视图所使用的控制器,还可以打印响应者链条。对逆向开发来说是非常好的工具。Chisel 是一个LLDB命令集合,用来辅助iOS应用程序的调试。

    Chisel安装

    执行以下指令,这些命令将在下一次Xcode启动时可用。

    brew update
    brew install chisel
    touch .lldbinit 
    open .lldbinit 
    # ~/.lldbinit
    command script import /usr/local/opt/chisel/libexec/fblldb.py
    # ~/.lldbinit
    command script import /path/to/fblldb.py
    

    Chisel常见指令

    • pviews 打印当前页面的所有视图
    (lldb) pviews
    <UIWindow: 0x7fd2d2409030; frame = (0 0; 414 896); gestureRecognizers = <NSArray: 0x600003ebd140>; layer = <UIWindowLayer: 0x6000030aa020>>
       | <UIView: 0x7fd2d2502010; frame = (0 0; 414 896); autoresize = W+H; layer = <CALayer: 0x6000030af380>>
    
    
    • pvc 打印当前页面的控制器
    (lldb) pvc
    <ViewController 0x7fd2d24087a0>, state: appeared, view: <UIView 0x7fd2d2502010>
    
    • visualize在Mac OX中打开一行图片。
    (lldb) visualize image 
    2018-12-31 10:20:51.585312+0800 LLDB[91663:4192443] XPC connection interrupted
    
    • fv 在视图中找到一个指定类型的视图
    (lldb) fv UIView
    0x7fc37ff0f330 UIView
    
    • show/hide显示或隐藏视图
    (lldb) hide self.view
    
    hide self.view
    (lldb) show self.view
    
    show self.view
    • presponder打印响应者链条
    (lldb) presponder self.view
    <UIView: 0x7fc37ff0f330; frame = (0 0; 414 896); autoresize = W+H; layer = <CALayer: 0x60000382c6a0>>
       | <ViewController: 0x7fc37fc133e0>
       |    | <UIWindow: 0x7fc37fc13d40; frame = (0 0; 414 896); gestureRecognizers = <NSArray: 0x60000362aa60>; layer = <UIWindowLayer: 0x600003820de0>>
       |    |    | <UIApplication: 0x7fc37ff01f50>
       |    |    |    | <AppDelegate: 0x60000387c1a0>
    

    三、Cycript工具

    Cycript概述

    Cycript 是Objective-C++、ES(JavaScript)、Java等语法的混合物。
    可以用来探索、修改、调试正在运行的Mac\iOS App

    Cycript基本使用

    开启
    cycript
    
    退出
    ctrl + D
    
    清屏
    commond + R
    
    调试App
    cycript -p 进程ID
    cycript -p 进程名称
    

    Cycript常见语法

    获取应用的程序的IUApplication
    UIApp
    
    定义变量
    var 变量名 = 变量值
    
    用内存地址访问对象
    #内存地址
    
    获取App所有的类
    ObjectiveC.classes
    
    查看对象的所有成员变量
    *对象
    
    递归打印View的所有子空间(跟LLDB一样的函数)
    view.recursiveDescription().toString()
    
    获取当前页面的所有控制器
    choose(UIViewController)
    

    Cycript使用

    cd到下载目录直接运行,在terminal输入cycript
    配合MoneyDev给手机装上越狱APP即可对手机进行操作,如下已进入cycript

    // 6666为猴子里面的默认端口号 ip为手机的ip
    HanDaDaMacBook-Air:~ chian$ ./cycript -r 192.168.2.2:6666   
    
    

    组合键control + d退出cycript

    • UIApp // 打印App对象
    • var keyWind = UIWindow.keyWindow()//定义对象。
    • keyWind.recursiveDescription().toString() //将成员变量以字符串表现出来
    • choose(UIButton) //搜索指定控件
    • *keyWind //遍历其中元素isa等
    • #0x00000001.text = "100"//通过对象地址的成员变量修改内容
    • #0x00000001.backgroundColor = UIcolor.yellowColor //修改成员变量的颜色

    调用Cycript更简单的方式

    在 ~/.bash_profile文件中配置好路径,下次在终端执行可以直接执行cycript,更方便了。
    我将所有的自定义.sh文件统统放进/Users/chian/apt目录中,
    然后在打开.bash_profile文件并修改。

    $vi ~/.bash_profile
    
    # 增加了CY路径
    export CY=./apt/cycript_0.9.594/
    # 在后方增加:$CY就可以了
    export PATH=/usr/local/bin:$PATH:$CY
    

    修改后让其生效

     $source ~/.bash_profile
    

    相关文章

      网友评论

          本文标题:六、iOS逆向之《LLDB高级用法&Cycript》

          本文链接:https://www.haomeiwen.com/subject/ebeukqtx.html