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

前言

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

一、ASLR

ASLR概述

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

简而言之:为了安全,内存中,程序文件的地址要偏移,而偏移量则是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
; layer = >
   | >

  • pvc 打印当前页面的控制器
(lldb) pvc
, state: appeared, view: 
  • 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
>
   | 
   |    | ; layer = >
   |    |    | 
   |    |    |    | 

三、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》)