前言
上节文章讲解了一些
lldb
的常用命令,这篇文章我们来讲解一些lldb
的高级用法。
一、ASLR
ASLR概述
ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。
ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。据研究表明ASLR可以有效的降低缓冲区溢出攻击的成功率,如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术。
简而言之:为了安全,内存中,程序文件的地址要偏移,而偏移量则是ASLR偏移,偏移量的多少是随机的,每次程序进程退出后,偏移量又会改变。
理解ASLR这个概念之后可以做点什么?
举个例子:
我通过一些工具可以直接查看到Mach-O的方法地址,通过这个地址我们可以在这个地址打个断点,但是打断点时发现断点失败,或者断点位置根本不是我们想要的地方。这时我们可以考虑是因为ASLR偏移量的缘故。
通过Hopper工具查看自定义方法eat:
方法在内存中的地址。
图中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
(lldb) 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