十八、 ASLR

一、代码断点的注意点

给脱壳的Mach-O文件打断点时,不能用函数名来打断点,要用函数地址来断点,并且加上地址偏移值。

1、登录手机;
2、手机监听10011端口发过来的指令:debugserver *:10011 -a WeChat;

3、Mac上进入lldb,连接本Mac的10011端口:

十八、 ASLR_第1张图片

4、打断点

十八、 ASLR_第2张图片
十八、 ASLR_第3张图片

虽然说用函数的地址值来打断点可以成功,但实际并没有断点到这个函数,还需要加上地址偏移。

5、获取偏移地址
偏移地址如下:

image list -o -f

6、重新打断点
hooper上的地址102096354转换成十六进制0x102095f80.

这里看到的断点信息,跟hooper中看到的方法名是不一样的,因为hooper中的信息是release版本的信息,这是正常的。

7、验证断点打对了


二、MachO的虚拟内存分段

十八、 ASLR_第4张图片
十八、 ASLR_第5张图片

_PAGEZERO、_TEXT、_DATA、_LINKEDIT
这四个段从内存上看,都是挨着的。

iOS4.3开始引入了ASLR技术,也就是有了_PAGEZERO这个东西。


三、FileOffset、FileSize

1、_PAGEZERO

十八、 ASLR_第6张图片

只有在载进内存的时候才会分配一个_PAGEZERO段。

2、_TEXT

十八、 ASLR_第7张图片

从头部(Mach64 Header)开始都是代码段,一直到380C000为止,380C000又是下一段_DATA的开始,如下:

十八、 ASLR_第8张图片

3、_DATA

十八、 ASLR_第9张图片
Data载进内存后会变大


四、小结、讨论

十八、 ASLR_第10张图片


五、ASLR简介

十八、 ASLR_第11张图片

有了ASLR后,函数的内存地址每次都不一样。


六、获得函数的真实内存地址

hoop中显示的地址,是未使用ASLR的内存地址(VM Address)。

如何知道偏移地址:

image list -o -f
image.png

hooper上的地址102096354转换成十六进制0x102095f80.

这里看到的断点信息,跟hooper中看到的方法名是不一样的,因为hooper中的信息是release版本的信息,这是正常的。

公式


七、函数在MachO文件中的位置

方法一:hooper
十八、 ASLR_第12张图片

hooper中展示的函数内存地址是没有ASLR的,但有_PAGEZERO,从0x100000000开始放代码段,对应回Mach-O文件是没有_PAGEZERO的,所以要减去0x100000000。

十八、 ASLR_第13张图片

可看出0x2095f80在 0x4000 - 0x2FADCB8的范围内,说明这个函数在_text段。

方法二:ida64
十八、 ASLR_第14张图片

ida文件大,分析的更详细,信息更多。


八、全局变量在MachO文件中的位置

证明下全局变量在MachO文件中的哪个位置。

1、在XCode中打印全局变量的内存地址;
2、计算后,对应到Mach-O文件的哪个区间;

十八、 ASLR_第15张图片
这是真实的地址,包含了ASLR地址
十八、 ASLR_第16张图片
ASLR偏移地址
十八、 ASLR_第17张图片
计算出Mach-O中的地址

Mach-O地址 = 真实地址 - 偏移地址 - _PAGEZERO大小

十八、 ASLR_第18张图片

举个例子,对比下,堆、栈、data段地址:

十八、 ASLR_第19张图片

堆栈空间地址都是超大的,在data数据段的后面。


九、答疑

1、_PAGEZERO的作用是什么?

一个安全区域,防止错误:

十八、 ASLR_第20张图片

你可能感兴趣的:(十八、 ASLR)