十八、 ASLR

2018-12-23  本文已影响145人  Lovell_

一、代码断点的注意点

给脱壳的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文件的哪个区间;

这是真实的地址,包含了ASLR地址 ASLR偏移地址 计算出Mach-O中的地址

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

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

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

九、答疑

1、_PAGEZERO的作用是什么?

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

上一篇下一篇

猜你喜欢

热点阅读