在我们关于 macOS 恶意软件逆向工程技能教程的第 1 部分中,我们发现了一个包含加密代码的可疑文件。让我们继续调查我们隔离的 VM 中的恶意软件样本。是时候介绍静态分析技术和 Mach-O 二进制格式了。
什么是 Mach-O 二进制文件?
让我们将目录更改为../MacOS/
并列出内容。
正如预期的那样,有一个二进制文件。让我们运行
file
它,看看它说了什么:
$ file UnPackNw
该file
实用程序告诉我们这是一个 Mach-O 二进制文件。我们将把理论降到最低限度,因为这是一个实用的动手教程,但我们确实需要涵盖这意味着什么的基础知识。
如果您有 Windows 或 Linux 背景,您可能会熟悉它们的基本文件类型 PE 和 ELF。尽管 macOS 继承了 Linux 的 Unix 传统,但它不能原生运行 ELF(或者,实际上,PE 文件,至少在没有导入像 Mono 这样的框架的帮助下是这样)。相反,它有一种称为 Mach-O 的独特文件格式,它基本上有两种风格:所谓的“胖”或包含多个架构的通用二进制文件,以及单一架构的 Mach-O 类型。如果您检查perl
二进制文件,例如,使用file
and lipo
,您会发现它是一个“胖”文件。
如果您发现自己在处理“胖”二进制文件,您可以轻松地使用该lipo
工具来提取 Mach-O 架构,但在本教程中我们不需要这样做。
通过探索段和部分来逆向恶意软件
让我们使用pagestuff
实用程序首先查看二进制文件的内部结构。
$ pagestuff UnpackNw -a
我们的 Mach-O 二进制文件包含许多段,这些段又由段组成。就本教程而言,我们只需要知道 __TEXT 段包含 __text 部分,其中包含所有可执行函数和方法。可以在此处和此处找到有关此主题的一些很好的介绍,我强烈推荐给认真研究 macOS 恶意软件逆向工程的任何人。
pagestuff
输出显示恶意软件包含一些有趣的 Objective-C 方法,包括“deleteAppBySelf”和“silentlyFireURL:”。
nm
我们可以使用该实用程序获得类似且可能更有用的信息。我将使用-m
此处的开关按字母顺序显示 Mach-O 段和部分名称,但您绝对应该查看其man
页面以查看其他一些选项。
$ nm -m UnpackNw
关于我们神秘的加密文本文件,从这些输出中立即引起我注意的方法是“encryptDecryptOperation:”类方法。让我们做更多的挖掘。
强大的strings命令
静态分析最有用的实用程序之一是strings
实用程序。
让我们将二进制文件中的 ASCII 字符串转储到单独的文本文件中,以便我们可以更轻松地查看和操作它们。该strings
实用程序有许多选项,但我喜欢使用该-
选项。这会导致实用程序在文件的所有字节中查找字符串:
$ strings - UnPackNw > ~/Malware/strings-.txt
这里有一些有趣的东西,包括一些 URL 和其他包标识符。我们甚至找到了对开发人员自己的文件系统和一些用户名的文件引用。如果您尝试在恶意软件活动中建立归因,则此类信息可能非常有用。
如果您熟悉strings
在 Linux 上使用,请注意 macOS 版本并不完全相同。具体来说,它不具备解码 unicode 的能力,因此对于严肃的工作,您可能想尝试类似floss之类的东西,它更强大一些。
检查文件中的字符串可以让您很好地了解恶意软件的功能,但我们仍然没有更接近我们的加密文本文件。是时候给你介绍一下了otool
。
使用 Otool 检查二进制文件
我的主要“使用”工具之一是otool
. 让我们快速看看你可以用它做什么。与strings
其他工具一样,我通常将所有这些信息转储到单独的文本文件中,以便我可以随意浏览它们。
让我们从看看二进制链接到哪些共享库开始。
$ otool -L UnPackNw > ~/Malware/libs.txt
由此,我们可以看到我们的恶意软件将有一些能力通过链接到WebKit框架来实现浏览器功能,这是我们在广告软件类型感染中所期望的。
我们还可以从 Mach-O 二进制文件的 ObjC 部分转储方法名称: $ otool -oV UnPackNw > ~/Malware/methods.txt
最有用的是,我们可以通过以下方式获得反汇编:
$ otool -tV UnPackNw > ~/Malware/disassembly.txt
在反汇编中,让我们搜索我们的混淆文本文件的名称,'unpack':
检查第 48 行和第 58 行之间的代码。这里我们看到从包的资源文件夹中获取文件内容的调用。向下滚动到第 67 行,我们看到从文件内容创建一个字符串,然后在第 73 行调用解密该字符串。
我们来看看解密方法,我们可以在vi的命令行中搜索:
这将我们带到第 2185 行:
第 2190 到 2193 行很有启发性。我们开始接近解决我们加密文本文件的奥秘。在这一点上,我可能会跳到 Cutter 或 Hopper 看看它在伪代码中的样子,但程序集已经向我们暗示这将遍历一些硬编码的字符串,并可能对加密的 unpack.txt 文件中的每个字符进行XOR .
基于程序集构建您自己的解密器可能是一个有趣的脚本练习,但运行代码并查看它在内存中被解密的速度更快。换句话说,我们需要深入进行一些动态分析。这正是我们将在第 3 部分中要做的事情。
编制妥协指标
不过,在我们走之前,让我们继续围绕拆解搜索,看看我们还能确定什么。从我们的字符串输出中,我们注意到一些对/bin/
和的引用NSTask
,它们是恶意软件正在调用命令行实用程序的迹象,所以让我们在反汇编中搜索那些。查看第 327 行:
在这里,我们可以看到代码将chmod
字符串加载到寄存器中,并且恶意软件在第 346 行更改了文件的权限,使其成为全球可读、可写和可执行的。其他搜索将显示二进制文件将创建、执行和执行删除某种脚本,并使用 AppleScript 读取文件并执行它。
我在这个阶段的建议是搜索感兴趣的东西,直到你对二进制文件的内容有一个总体印象。例如,对反汇编和字符串文件进行 grepping 可以显示硬编码的 URL。
通过检查我们迄今为止生成的输出类型,您将了解恶意软件将如何工作,并且您应该能够为 Yara 规则或其他搜索引擎参数开发 IoC。根据您想要检测此恶意软件的方式,您可以轻松构建规则,在二进制文件中搜索第 2190 行的字符串或硬编码的 URL,但与此同时,恶意软件作者也可以轻松地将其替换为其他人在他们的下一次迭代中,从而打破你的检测。更健壮的方法是点击方法名称,您可能需要选择其他一些东西来确保避免误报。
这将击败懒惰的恶意软件作者,但对手在构建时重构他们的代码并混淆方法名称并不需要太多努力,因此即使是那种字符串检测也只能暂时起作用。
另外,请注意,除了尚未找到我们的模糊文本之外,我们不知道是否还有其他 IoC 仅在运行时解析。这意味着您需要通过查看实际示例来补充您的静态分析,因为除了运行时之外无法确定许多有趣的行为。那么,动态分析就是我们的下一个任务!
结论
在这篇文章中,我们研究了如何反汇编文件并从中提取字符串和其他重要信息。我们以一种“老派”的方式完成了所有这些工作,没有使用专业级工具来说明基本技术。我们现在正处于真正需要查看恶意软件在行动中的作用的阶段,并且在这样做的同时,我们希望能够捕获 unpack.txt 文件中的加密字符串在内存中被解码。这就是我们接下来要去的地方,所以如果您喜欢这篇文章和上一篇文章,并希望继续了解我们如何最终解密神秘的编码文本文件,请务必订阅博客并加入我们的第 3 部分。到时候那里见!