在深刻学习Mach-O文件以前,先来回顾一下以前学习的Mach-O的基本结构,能够到官网查看Mach-O文件的介绍html
Mach-O文件有三部分组成python
在Mach-O文件中,Header部分存放了文件的基本描述信息,以下:sass
Load Commands指定了文件在虚拟内存中的逻辑结构和布局,以下安全
在Load Commands中存储了各类段的基本信息,下面以LC_SEMENT_64(__PAGEZERO)中的信息为例bash
__PAGEZERO是Mach-O加载进内存以后附加的一块区域,它不可读,不可写,主要用来捕捉NULL指针的引用。若是访问__PAGEZERO段,会引发程序崩溃markdown
在Raw Segment Data中就存放了全部段的原始数据架构
size -l -m -x Mach-O文件路径 复制代码
ASLR其实就是Address Space Layout Randomization,地址空间布局随机化。它是一种针对缓冲区溢出的安全保护技术,经过对堆、栈、共享库映射等线性区布局的随机化,经过增长攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。在iOS 4.3开始引入ASLR技术app
在未使用ASLR技术时,Mach-O被加载进内存后,是从地址0x000000000开始存放,前文说到,Mach-O文件自己是不存在__PAGEZERO的,在Mach-O文件被加载到虚拟内存以后,系统会给Mach-O文件分配一个__PAGEZERO,它的开始位置是0x000000000,结束位置是0x100000000。而且它的大小是固定的。dom
Mach-O自己的内容在虚拟内存中存放的开始位置从0x100000000开始,也就是紧接着__PAGEZERO的结束地址存放。并且在下图中,__TEXT段的File Offset为0,File Size为63062016,这表明着在Mach-O文件中,从0x000000000位置开始到0x003C24000为止存放的都是__TEXT段的内容。ssh
而__TEXT段在虚拟内存中存放的开始位置是0x100000000,终止位置是0x103C24000,这说明__TEXT段是原封不动的从Mach-O文件加载进虚拟内存中,紧接着__PAGEZERO存放的。
经过分析剩下的__DATA段、__LinkEDIT段等等能够得出如下结论
PS:在arm64架构中,__PAGEZERO段的终止位置是从0x100000000(8个0)而在非arm64架构中,__PAGEZERO段的终止位置是从0x4000(3个0)开始
在使用了ASLR技术以后,在Mach-O文件加载进内存以后,__PAGEZERO的开始位置就不是从0x000000000开始存放了,ASLR会随机产生一个地址偏移Offset,而__PAGEZERO的开始位置须要在0x000000000的基础上加上偏移量Offset的值,才是真正的存放地址。 假设随机偏移量Offset是0x000005000,那么__PAGEZERO的开始位置就是0x000005000,结束位置就是0x100005000。剩下的__TEXT段、__DATA段和__LINKEDIT段则依次偏移Offset便可,以下:
于Mach-O文件被加载进虚拟内存中时,因为使用了ASLR技术,致使内存地址产生Offset,因此要想获取函数的准确的内存地址,就须要知道当前具体的偏移量。而后使用如下公式就可得出函数在虚拟内存中的内存地址
函数的内存地址(VM Address) = File Offset + ASLR Offset + __PAGEZERO Size
复制代码
一般咱们使用Hopper、IDA等工具查看Mach-O文件所看到的地址都是未使用ASLR的VM Address,要想获取函数的真实虚拟内存地址,就须要找到Mach-O加载进虚拟内存后的随机偏移量Offset
上图中函数test的起始地址是0x6558,也就是说它的File Offset为0x6558。这个是它在Mach-O文件中的地址偏移。
运用上一章动态调试的知识,咱们来一步一步获取ASLR的偏移量
python tcprelay.py -t 22:10088 9999:10089
复制代码
ssh root@localhost -p 10088
复制代码
debugserver *:9999 -a ting 复制代码
➜ ~ lldb
(lldb) process connect connect://localhost:10089
复制代码
(lldb) image list -o -f grep | ting [ 0] 0x0000000000080000 /var/mobile/Containers/Bundle/Application/14C4F899-BD7B-41A4-BC1A-61892E7B943B/ting.app/ting(0x0000000100080000) 复制代码