• Hacking Team 武器库研究(五):Mac OSX 64位 Shellcode 技术分析

    日期:2015-07-16 | 分类:MAC安全

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/riusksk-logs/272277718.html

    在此次泄露的Flash 0Day的利用代码都包含针对Mac OSX 64位系统的利用,以往在网上看到的大多是windows平台32/64位的利用代码,很少有Mac版的flash利用代码曝光,刚好可以借机分析学习下军用级武器的写法。

     

    【源码分析】

     

    下面以第1HackingTeam泄露的CVE-2015-5119Flash 0day 漏洞中的利用代码为例:

     

    1、内在中暴力搜索Mach-o文件头magic标记0xfeedfacf(类似搜索windows平台下的PEMZ标记),它代表64位程序的意思,也是MacOS X上可执行文件的开头。

     


     

    可以用otool或者MachOView查看Mach-o可执行文件格式:

     


     

    2、在Mach-o文件头之后是加载命令(LoadCommand)区域,接下来程序搜索用于映射文件中的段到进程内存空间的LC_SEGMENT_64加载命令,遍历每个被加载的段,找到包含段标记为S_SYMBOL_STUBS(代表包含符号信息) S_ATTR_PURE_INSTRUCTIONS (代表包含机器码)的段,然后获取段地址Address、偏移量OffsetSizeStubs SizeStubs数量以及Indirect Sym Index(间接符号表索引值)。

     


     


     


     

    3、找到_LINKEDIT 段,从中获取相应的虚拟地址和文件偏移,然后互减得到两者之间的偏移量。

     


     

    4、获取LC_SYMTAB加载命令的相关信息,该命令用于指定文件所使用的符号表,找到后分别获取符号表偏移量、符号数、字符串表偏移量、字符串表大小

     


     


     

    5、获取LC_DYSYMTAB加载命令的相关信息,该命令用于指定动态链接库所使用的符号表,找到后获取间接符号表偏移量

     


     


     

    6、将前面获取的符号表地址、间接符号表地址和字符串表地址分别加上第3步获取的偏移量

     



     

    7、从前面获取的3个值,去字符串表中索引mprotect函数,找到其对应的内存地址,以利用它去真正的shellcode部分赋予可执行权限(这部分与Windows平台上的代码基本一致),以绕过DEP的保护。

     


     

    8、前面都是为执行接下来x64 shellcode代码而作的准备,由于vfork所创建的子进程与父进程共享数据,因此可用于检测是否位于沙盒中,若在沙盒中vfrok会执行失效,进而退出执行。

     


     

    9、通过为syscall指定调用号来调用execve函数,以执行"/Applications/Calulator.app/Contents/MacOS/Calculator”打开计算器,然后再调用exit退出子进程。

     


     

    10、设置返回值为int atom类型,左移3位是为了对最后3 bits 清零,因为它代表着atom类型,再加6是为了设置为int atom类型,因为shellcode相当于自定义函数,它是用于替换payloadJIT函数去执行的,最后弹出栈数据,以维持栈平衡。

     


     



     

    【总结】

     

           此次的Mac OSX 64位平台的利用,主要还是先根据Maco-o文件头标记找到flash模块,然后去索引符号表、间接符号表和字符串表,进而找到mprotect函数的地址,将shellcode内存块设置为可执行权限。真正用于弹出计算器的shellcode代码相对比较简单,向syscall传递调用号来执行execve函数,进而打开指定的程序文件Calculator,实现最终的任意代码执行。

     

    分享到: