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

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

##【源码分析】

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

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

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

2、在Mach-o文件头之后是加载命令(Load Command)区域,接下来程序搜索用于映射文件中的段到进程内存空间的LC_SEGMENT_64加载命令,遍历每个被加载的段,找到包含段标记为S_SYMBOL_STUBS(代表包含符号信息) 和 S_ATTR_PURE_INSTRUCTIONS (代表包含机器码)的段,然后获取段地址Address、偏移量Offset、Size、Stubs Size、Stubs数量以及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相当于自定义函数,它是用于替换payload的JIT函数去执行的,最后弹出栈数据,以维持栈平衡。

##【总结】

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