十八、 ASLR
一、代码断点的注意点
给脱壳的Mach-O文件打断点时,不能用函数名来打断点,要用函数地址来断点,并且加上地址偏移值。
1、登录手机;
2、手机监听10011端口发过来的指令:debugserver *:10011 -a WeChat;
3、Mac上进入lldb,连接本Mac的10011端口:
4、打断点
虽然说用函数的地址值来打断点可以成功,但实际并没有断点到这个函数,还需要加上地址偏移。
5、获取偏移地址
偏移地址如下:
image list -o -f
6、重新打断点
hooper上的地址102096354转换成十六进制0x102095f80.
这里看到的断点信息,跟hooper中看到的方法名是不一样的,因为hooper中的信息是release版本的信息,这是正常的。
7、验证断点打对了
二、MachO的虚拟内存分段
_PAGEZERO、_TEXT、_DATA、_LINKEDIT
这四个段从内存上看,都是挨着的。
iOS4.3开始引入了ASLR技术,也就是有了_PAGEZERO这个东西。
三、FileOffset、FileSize
1、_PAGEZERO
只有在载进内存的时候才会分配一个_PAGEZERO段。
2、_TEXT
从头部(Mach64 Header)开始都是代码段,一直到380C000为止,380C000又是下一段_DATA的开始,如下:
3、_DATA
Data载进内存后会变大四、小结、讨论
五、ASLR简介
有了ASLR后,函数的内存地址每次都不一样。
六、获得函数的真实内存地址
hoop中显示的地址,是未使用ASLR的内存地址(VM Address)。
如何知道偏移地址:
image list -o -f
image.png
hooper上的地址102096354转换成十六进制0x102095f80.
这里看到的断点信息,跟hooper中看到的方法名是不一样的,因为hooper中的信息是release版本的信息,这是正常的。
公式七、函数在MachO文件中的位置
方法一:hooper
hooper中展示的函数内存地址是没有ASLR的,但有_PAGEZERO,从0x100000000开始放代码段,对应回Mach-O文件是没有_PAGEZERO的,所以要减去0x100000000。
可看出0x2095f80在 0x4000 - 0x2FADCB8的范围内,说明这个函数在_text段。
方法二:ida64
ida文件大,分析的更详细,信息更多。
八、全局变量在MachO文件中的位置
证明下全局变量在MachO文件中的哪个位置。
1、在XCode中打印全局变量的内存地址;
2、计算后,对应到Mach-O文件的哪个区间;
Mach-O地址 = 真实地址 - 偏移地址 - _PAGEZERO大小
举个例子,对比下,堆、栈、data段地址:
堆栈空间地址都是超大的,在data数据段的后面。
九、答疑
1、_PAGEZERO的作用是什么?
一个安全区域,防止错误: