Hacking Team Mac OSX 64位 Shellcode 技术分析
在此次泄露的 Flash 0Day 的利用代码都包含针对 Mac OSX 64 位系统的利用,以往在网上看到的大多是 windows 平台 32/64 位的利用代码,很少有 Mac 版的 flash 利用代码曝光,刚好可以借机分析学习下军用级武器的写法。
下面以第 1 个 HackingTeam 泄露的 CVE-2015-5119Flash 0day 漏洞中的利用代码为例:
1 、内在中暴力搜索 Mach-o 文件头 magic 标记 0xfeedfacf (类似搜索 windows 平台下的 PE 头 MZ 标记),它代表 64 位程序的意思,也是 MacOS X 上可执行文件的开头。
可以用 otool 或者 MachOView 查看 Mach-o 可执行文件格式:
2 、在 Mach-o 文件头之后是加载命令( LoadCommand )区域,接下来程序搜索用于映射文件中的段到进程内存空间的 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 ,实现最终的任意代码执行。
本文专属二维码,扫一扫还能分享朋友圈