美文网首页
十八、 ASLR

十八、 ASLR

作者: Lovell_ | 来源:发表于2018-12-23 10:43 被阅读145次

    一、代码断点的注意点

    给脱壳的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的作用是什么?

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

    相关文章

      网友评论

          本文标题:十八、 ASLR

          本文链接:https://www.haomeiwen.com/subject/psmikqtx.html