Part 1
当前,用于介绍Windows平台和PE文件的恶意软件分析和逆向工程的学习资源汗牛充栋,但相比之下,介绍macOS恶意软件逆向分析以及macOS恶意软件分析技术方面的文献或教程,则少得可怜。鉴于此,在本系列文章中,我们将通过一个样本文件,向读者详细介绍如何使用本机工具和相关技术来深入考察该样本,并构建用于检测恶意软件的IoC列表。
由于本文的涉及面很广,所以,本教程将分为3个部分。其中,在第1部分中,我们将介绍如何设置安全环境来检测macOS上的恶意软件。同时,我们将为读者介绍如何安装所需的所有工具(全部都是免费的!),以及从哪里获取macOS恶意软件样本。然后,我们将为读者介绍如何考察应用程序包(application bundle)及其内容,从而掌握其工作原理并找到感兴趣的加密文本文件。在第2部分中,我们将为读者详细阐述Mach-O二进制文件(即macOS的本地可执行文件类型)的静态分析方面的基础知识。在第3部分中,我们向读者介绍如何使用动态分析技术以受控方式执行恶意软件文件并从内存中读取相应的代码。
本文非常适合希望学习macOS恶意软件逆向分析的读者阅读!
如何搭建测试恶意软件的安全环境
要测试恶意软件,我们需要下载一些虚拟化软件来运行客户机操作系统。对于macOS系统来说,常用的虚拟化软件为:VirtualBox、Parallels和VMWare。读者可以根据自己的喜好随便选择一个,然后阅读相关的文档来设置macOS虚拟机(任何最新版本都可以,但是本教程将使用运行在macOS 10.14.3上的Parallels Desktop VM实例)。
之后,让我们来查看客户机操作系统的配置选项。实际上,很多时候我们需要对某些设置进行相应的修改。例如,确保为VM提供了足够的RAM——2GB是最低的要求,但4GB应该让系统变得更加顺畅。出于同样的原因,显卡内存至少为512MB。
某些恶意软件会尝试检测当前是否运行于VM中,如果检测到自身运行于虚拟机中的话,就会改变某些行为。虽然我们不会在本教程中介绍详细如何处理这种情况,但有一个技巧对此是非常有帮助的,那就是修改机器的默认MAC地址。对于Parallels来说,在更改MAC地址时,可以使其不以00-1C-42开头,因为VirtualBox会将其改为08-00-27以外的任意值,同时,对于VMWare来说,请避免使用以下前缀:00-50-56、00- 0C-29和00-05-69。
隔离macOS客户机!
最重要的是,将VM guest虚拟机(下面简称客户机)与实际计算机(“宿主机”)隔离开来。这意味着您不得共享任何驱动器或文件夹,包括备份。这是为了防止恶意软件逃逸出客户机。为此,我甚至都禁止共享剪贴板。
至于如何执行上面的操作,则取决于您使用的VM软件及其版本,就Parallels Desktop 14而言,相关的选项位于“Security”选项卡中。
对于最新版本的VMWare Fusion来说,我们不仅可以检测“Isolation”面板,还可以浏览其他面板(例如,“Sharing”面板),并禁用将客户机连接到宿主机的所有选项。实际上,VM实例唯一需要访问的只有Internet选项,这通常是默认设置。
完成这些修改后,启动VM,并确保Shared Folders为空。
虽然隔离是必不可少的,但如果您想使用一些屏幕截图或输出文件以供将来参考的话,该怎么办呢? 在这种情况下,可使用客户机的浏览器和wetransfer.com等免费服务,将经过压缩处理和受密码保护的文件发送给自己即可。
用于测试macOS恶意软件的相关工具
从现在开始,假设我们讨论的所有操作都是在隔离VM实例中进行的。读者不妨花点时间根据自己的喜好调整系统偏好设置或应用程序首选项,特别是终端,因为我们经常会用到它们。
在命令行上,我们可以使用strings实用程序来设置安装Apple命令行工具的提示,具体如图所示。
这里有个好消息:您现在已经安装好了学习macOS恶意软件分析和逆向工程的所需的全部工具!
这些工具包括字符串解码程序(strings),文件分析实用程序(file、nm、xattr、mdls等),十六进制编辑器(hexdump、od、xxd),静态反汇编程序(otool),以及调试器、内存读取程序和动态反汇编程序(lldb)。最重要的是,这些都是免费的!
是的,您可能一直希望听到专业人员使用的各种炫酷的工具,比如Hopper、Cutter、Radare2、Floss,以及可以从公共repos上下载的数以百计的优秀社区工具。
别急,我们将在本系列以及后续文章中陆续介绍其中的部分工具,但目前还无需介绍它们。为什么这么做呢?因为作为初学者,最重要的事情是理解相关的基本概念。虽然专业工具对于节省时间和提高工作效率非常有用,但在学习过程中,它们很容易混淆或隐藏重要的细节。
如何寻找macOS恶意软件样本
在我们着手学习macOS恶意软件分析和逆向工程之前,需要先完成一件事:找到一些macOS恶意软件!
让我们在客户机上设置一个工作目录,用以保存样本以及所做的各种工作,具体命令如下所示:
$ mkdir ~/Malware
获取恶意软件样本的途径有很多。最受欢迎的途径可能便是Virustotal,但是,只有付费帐户,才可以从该网站下载样本。幸运的是,还可以从其他公共存储库下载恶意软件样本,如malpedia和malshare。我们在本教程中使用的样本的哈希值如下所示,并且该样本可以从上面所有途径获得:
197977025c53d063723e6ca2bceb9b98beff6f540de80b28375399cdadfed42c
虽然该样本并非世界上最危险的恶意软件,但是的确会带来一些意想不到的行为,例如它会下载一个神秘的恶意软件,苹果公司将其标记为MACOS.35846e4 。同时,该软件还对其代码进行了混淆处理,也就是说,我们需要设法对其进行去混淆处理。
macOS恶意软件文件分析
下载样本后,请将其移至您的工作目录。如果您当前不是在终端中的话,请立即切换到命令行环境,并将该文件重命名,以便于今后的管理:
$ mv 197977025c53d063723e6ca2bceb9b98beff6f540de80b28375399cdadfed42c.dms malware01
下面,我们用file工具来考察这个文件:
$ file malware01
如您所见,这是一个zip压缩文件,所以,首先进行解压:
$ unzip malware01
很明显,这是一个macOS应用程序包(application bundle),具有常规的层次结构。
如何检查CodeSignature
有趣的是,如果开发人员对程序进行了签名的话,该程序就会带有一个_CodeSignature文件夹。下面,让我们来看看开发人员到底是谁。
$ codesign -dvvvv -r - UnpackNw.app/
我们可以利用其中的某些信息来构建IoC列表。程序包标识符(bundle Identifier)和TeamIdentifier(又名Apple Developer签名证书)都可以用于检测软件,因此只要存在_CodeSignature文件夹,分析的初期就应该将这些信息记录下来。
下面,让我们看看开发人员的证书是否仍然有效:
$ spctl --verbose=4 --assess --type execute UnpackNw.app
如果代码签名已经失效,会在输出中看到CSSMERR_TP_CERT_REVOKED。就这里而言,证书仍然有效。
不过话说回来,即使代码签名有效的话,也说明不了多少问题。毕竟当前存在很多虚假和流氓开发者帐户。此外,如果应用程序想要正常运行,需要通过Gatekeeper和XProtect的检查,但是,我们也可以设法绕过它们,这部分内容将在后面加以介绍。
应用程序包的结构
我们现在将目录转换为程序包,这样就可以更轻松地处理其内容了。
$ cd UnpackNw.app/Contents
在Mac的应用程序包中,除了肯定有一个Info.plist外,还至少存在另外两个文件夹:一个是存放程序包的主可执行文件的MacOS文件夹;另一个是Resources文件夹,该文件夹可以存放开发人员想要打包的任何东西,包括脚本和可执行文件。当然,在其他样本中,您还可能会看到其他文件夹,例如Frameworks、Plugins等。有关程序包结构的更多信息,请参阅Apple的相关文档。
Info.plist可以存放应用程序功能方面的有用信息。我们可以在命令行上使用带有-p开关的plutil命令来读取这些信息。
请注意,它包含来自codesign实用程序的程序包标识符,因此,如果您正在处理的样本没有代码签名,则可以在此处获取相应的IoC列表。
我们可以通过Info.plist获取许多有用的信息,例如样本适用的macOS的最低版本,甚至是恶意软件作者在构建它时使用的macOS版本和内部版本号。如果我们试图弄清楚为什么有些代码被包含或不被包含,或者为什么有些版本的恶意软件在不同的受害者的机器上运行不同,那么知道开发人员的构建版本可能是一个重要的线索。
让我们转到Resources文件夹。解压zip文件时,我注意到了一些有趣的东西。
“unpack.txt”文件是做什么的?为什么它后面有一个星号?一窥究竟之前,让我们先收集更多关的细节。
如何收集文件元数据
对于macOS上的任何文件来说,我们都可以借助各种命令来收集其元数据,并且,在打开未知文件之前,最好先收集其元数据。
让我们从file实用程序开始入手,看看文件内容与其扩展扩展名是否匹配。在这个例子中,我们发现该文件只是一个常规的ASCII文本文件。
如上图所示,我们可以使用xattr -l和ls [email protected]来列出文件的扩展属性和权限。
mdls工具是一个很棒的实用工具,它还能列出Spotlight和Finder的元数据。由于这些元数据在文件传输过程中是保持不变的,因此,有时也可以藉此处捕获有关来源的信息。关于这些实用程序的详细用法,请参考其手册页。
下面,我们再看一下ls [email protected]的输出。其中,权限列表中的这三个x字符表示它具有可执行权限,这对于纯文本文件来说是非常奇怪的。同时,文件名末尾的星号也表明,这是一个具有可执行权限的文件。
好吧,让我们看看文件里面有什么!您可以使用带有GUI界面的cat或常规文本编辑器,但我更喜欢使用vi命令。
哇,这就有意思了!一个纯文本文件,具有可执行权限,并且存放的是经过混淆处理的代码,确实可疑! 但这些混淆的代码的含义是什么?为此,我们需要深入考察可执行文件才能找到答案。这是下面的内容介绍的对象!
小结
在这篇文章中,我们介绍了建立安全测试环境的重要性以及如何测试macOS恶意软件。同时,我们也展示了如何以及从何处获取恶意软件样本,以及如何确定应用程序包包含的内容,如何读取文件元数据。在我们的示例中,我们发现了一些有趣且经过混淆的内容。但是,如何去混淆呢? 在第2部分中,我们将继续探索macOS逆向工程技术,并深入研究Mach-O可执行文件的静态分析、Mach-O反汇编,等等!
Part 2
在第1部分中,我们发现了一个包含加密代码的可疑文件。接下来,让我们继续调查隔离的VM中的恶意软件样本。具体来说,下面将介绍静态分析技术和Mach-O二进制格式。
什么是Mach-O二进制格式?
让我们切换到 ../MacOS/目录,并列出其中的内容。
这里果然有一个二进制文件。好了,让我们先用file命令来考察一下:
$ file UnPackNw
运行结果表明,这是一个Mach-O二进制文件。为了帮助读者理解,我们先来介绍关于Mach-O二进制格式的基础知识。
如果您之前使用的是Windows或Linux系统,您可能已经熟悉其基本的文件类型,即PE和ELF。尽管macOS与Linux都是派生于Unix传统,但它本身不能运行ELF(或者实际上是PE文件,至少在没有导入像Mono这样的框架的帮助下如此)。相反,它使用的是称为Mach-O的独特文件格式,该格式基本上有两种形式:所谓的“fat”或通用二进制文件,这种形式的二进制文件适用于多种架构;另一种为Mach-O类型,它只能适用于单一架构。如果您检查perl二进制文件,例如,使用file和lipo,会发现它是一个“fat”文件。
如果您发现自己处理的是“fat”二进制文件,则可以使用lipo工具来轻松提取Mach-O体系结构,但在本教程中我们不需要这样做。
通过探索段和节来逆向分析恶意软件
让我们使用pagestuff实用程序来初步了解二进制文件的内部结构。这个工具有点奇怪,因为开关位于文件名之后:
$ pagestuff UnpackNw -a
我们的Mach-O二进制包含许多段,这些段又由节组成。就这里来耍,我们只需要知道__TEXT段包含__text节,其中包含所有可执行函数和方法。关于这一主题,网上有两篇非常棒的文章(见这里和这里),强烈建议想深入学习macOS恶意软件逆向分析的读者认真阅读这些文章。
pagestuff的输出结果表明,这个恶意软件包含一些有趣的Objective-C方法,包括“deleteAppBySelf”和“silentlyFireURL:”。
我们可以使用nm实用程序获得类似但可能更有用的信息。我将在这里使用-m开关按字母顺序显示Mach-O段和段名。关于该程序的详细介绍,请查看其手册页。
$ nm -m UnpackNw
对于我们神秘的加密文本文件,输出结果中的“encryptDecryptOperation:”类方法会立刻引起我们的高度注意。接下来,我们将对其进行更深入的考察。
发挥strings工具的强大威力
静态分析最有用的实用程序之一是strings实用程序。
让我们将二进制文件中的ASCII字符串转储到单独的文本文件中,以便我们可以更轻松地查看和操作它们。strings实用程序有很多选项,但我最喜欢使用的是 -选项。这样的话,该实用程序将在文件的所有字节中查找字符串:
$ strings - UnPackNw > ~/Malware/strings-.txt
这里有一些有趣的东西,包括一些URL和其他包标识符。我们甚至找到了对开发人员自己的文件系统和一些用户名的文件引用。如果要对恶意软件进行关联分析的话,则这类信息将非常有用。
如果读者熟悉Linux系统中strings命令的用法的话,请注意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行之间的代码。这里我们看到,该调用是从程序包的Resource文件夹中获取文件的内容的。向下滚动到第67行,我们发现它使用该文件的内容创建了一个字符串,然后在第73行处对这个字符串进行解密。
我们来看看解密方法,具体如下所示:
这会将我们带到2185行:
第2190至2193行代码表明,我们很快就可以解开加密文本文件的神秘面纱。现在,我们可以单步进入Cutter或Hopper,并考察其伪代码,但是程序集已经告诉我们,它们会遍历一些硬编码字符串,并且与加密的unpack.txt文件中的每个字符进行异或操作。
这里,我们将运行代码并查看它在内存中的解密过程。为此,我们需要深入研究一些动态分析技术。这正是我们在第3部分中要做的。
编制IOC
但是,进行动态分析之前,让我们先继续搜索反汇编代码,看看我们还能有什么发现。从strings的输出结果中,我们注意到对/bin/和NSTask的引用,这表明该恶意软件会调用命令行实用程序,所以让我们在反汇编中搜索相关线索。请注意第327行:
在这里,我们可以看到代码会将chmod字符串加载到寄存器中,并且该恶意软件修改了文件的权限,使其在第346行变得可读、可写和可执行。其他搜索结果表明,该二进制文件将创建、执行并删除某种脚本,并使用AppleScript读入文件并执行之。
我在这个阶段的建议是,尽量搜索我们感兴趣的东西,直到你得到二进制文件的整体印象。例如,考察反汇编代码和字符串文件可以帮助我们找到硬编码的URL。
通过上述各种输出结果,不仅可以帮助我们了解恶意软件的运行机制,并且还能够为Yara规则或其他搜索引擎参数开发相应的IoC。此外,我们还可以据此轻松地构建规则,在二进制文件中搜索类似于第2190行的字符串或硬编码的URL,但同时,恶意软件作者也很容易在下一次迭代中换掉这些字符串替,从而使这些检测方法失效。因此,更加健壮的检测方法是使用方法名,并且借助其他辅助手段来避免误报。
这种方法虽然可以击败懒惰的恶意软件作者,但是对手可以在构建时重构代码并混淆方法名称,且这些工作并不复杂,所以即使是这种字符串检测方法的有效性也可能只是暂时的。
另外,请注意,除了尚未找到晦涩的文本外,我们也不知道是否还有其他只在运行时才解析的IoC。这意味着您需要通过考察处于运行状态中的样本信息来补充静态分析方法的不足之处,因为对于某些有趣的行为来说,只能在运行时才能被发现。那么,动态分析就是我们的下一个任务!
小结
在这篇文章中,我们研究了如何对文件进行反汇编处理,并从中提取字符串和其他重要信息。这里,我们是以一种“老派”的方式来进行所有这些工作的,而没有使用专业级工具来阐释各种基本的技术。接下来,我们将为读者详细介绍如何通过动态分析技术解开加密文本的神秘面纱。
Part 3
在本文的第1部分中,我们在Resources文件夹中找到了包含加密代码的unpack.txt文件。在第2部分中,我们继续使用静态分析技术对主可执行文件进行了相应的考察,以了解更多信息。同时,我们在二进制文件中找到了一个名为“ennCryptDecryptString:”的方法。我们估计,文本文件中的代码可能就是通过它读入内存的。
现在,我们将以受控的方式在隔离的VM中运行样本,这样就可以对其进行全方位的考察。特别是,我们希望以明文形式读取unpack.txt文件中的加密字符串,以便帮我们揭示该恶意软件的行为。
如何运行被Apple所阻止的恶意软件
为了运行我们的恶意软件,我们必须首先确保它没有被Apple的Gatekeeper或XProtect功能所阻止。您可以通过在命令行上列出扩展属性来检查Gatekeeper是否已标记文件。这里,我们通过将-l标志和文件路径传递给xattr实用程序来实现完成这项任务。
$ xattr -l UnPackW
如果返回的结果中含有com.apple.quarantine,说明该文件将受到本地Gatekeeper策略的某些限制(可以通过System Preferences > Security选项卡中设置或通过spctl设置,并将其存储在/var/db/SystemPolicy中)。
com.apple.quarantine: 0083;5caf3e68;Safari;5FFF1FBA-3A55-4647-8280-DBB57E3FC8A1
Gatekeeper还会将文件传递给XProtect,以检查它是否为Apple的恶意软件规则所知。这些检查是为了保证用户的安全,但在就这里来耍,我们不希望操作系统阻止我们的样本。由于我们的可执行文件可能会调用程序包中的其他文件,包括在Resources文件夹中的unpack.txt文件,最好从整个程序包中删除隔离位,而不仅限于可执行文件。要删除扩展属性并绕过Gatekeeper和XProtect,我们只需传递-rc标志,然后将文件路径传递给xattr即可。
$ xattr -rc ~/Malware/UnPackNw.app
如何使用LLDB检查恶意软件
最后,我们已准备好迎接最有趣的部分:些动态分析! 为此,我们需要使用lldb,这是一个低级调试器,在本教程的开头部分已经介绍了其安装方法。
现在,请打开终端会话,并切换到UnPackNw.app包的“MacOS”目录下面。
$ cd ~/Malware/UnPackNw.app/Contents/MacOS
我们将在交互模式下使用lldb,所以启动该程序时,不要使用任何参数:
$ lldb
您将看到命令行提示符,其中$符号由(lldb)替换,表示我们已进入交互模式。下一步是使用其file命令告诉调试器我们要附加哪个文件。请注意,这是lldb本身的命令,与我们之前在本教程中使用的file实用程序无关。
(lldb) file UnPackNw
下面将file实用程序的输出与lldb中的file命令的输出进行比较,如下图所示。
现在,告诉调试器我们想要附加哪个文件,这样一来,我们就不必继续在交互式会话中传递文件名和发号施令了。
下一步是启动恶意软件,但我们不想让它为所欲为。因此,我们需要对该软件的运行进行适当的控制,这一点可以通过process命令来实现。让我们来看看这个命令的作用:
(lldb) help process
您将看到process命令及其各种子命令的帮助信息。让我们继续深入挖掘其用法,例如,可以使用带有-s选项的launch子命令:
(lldb) help process launch
您将看到每个选项的作用。当我们启动launch子命令时如果使用了-s选项,它会启动可执行文件,并在它到达程序的第一个函数入口点时尝试暂停执行。
就本例来说,第一个入口点应该是dyld_start,因为动态链接器在获取二进制文件自身代码之前会首先加载恶意软件依赖的各种库(前文说过,我们可以使用otool -L列出相关的依赖库)。
但是,一些恶意软件试图掩盖其真正的入口点,而其他恶意软件则试图阻止您使用各种技巧附加调试器,因此,我们需要设法解决这些问题。
在LLDB中启动进程
让我们试一试,看看会发生什么(提醒:当然,我们必须在前面设置的隔离虚拟机中执行这些操作!)。
(lldb) process launch -s
太棒了!正如预期的那样,我们已经在代码执行开始时停止了dyld_start。现在,我们可以在自己感兴趣的方法上面设置断点。请注意,该方法可能拼错了,所以请确保键入的内容与代码中显示的内容完全一致。
(lldb) breakpoint set -n "+[EncodeDecodeOps enncryptDecryptString:]"
请检查是否收到确认断点已在给定地址正确设置的确认。如果您看到“no locations (pending)”或任何其他警告之类的消息,请检查您的输入,然后重试。在lldb中设置断点的方法有很多,包括使用正则表达式,但是现在的要求是确保事情正确无误,而不关心“茴”字有几种写法。如果你不小心设置了一个你不想要的断点,可以使用breakpoint delete命令或缩写版本的br del命令来删除所有断点并重新开始(你也可以单独删除断点,这个留作作业由读者自己探索)。
在我们成功设置断点后,我们需要键入continue命令或字母c来告诉调试器继续执行,直到到达我们的断点为止。
我们将在该函数的入口处停下来。下面,让我们多看些汇编代码:
(lldb) disassemble
向后滚动到输出内容的开头部分(为此,可以使用command+向上箭头组合键)。这时,您会在左侧看到一个右向箭头指向我们当前“停摆”的地址。
让我们向下滚动到“initWithString:”所在的位置。
这看起来像是一个方法名,其代码将根据unpack.txt中的加密代码创建新的纯文本字符串。因为它出现在函数返回的最后一次调用之前,我们可以假设这个函数的用途就是返回解密的字符串。
让我们看看这个假设是否正确。我们将直接在地址0x100003d10处设置另一个断点(这里“initWithString:”被移入rdi寄存器),然后继续执行。这次我将使用缩写形式的语法:
(lldb) br s -a 0x100003d10 (lldb) c
如何在LLDB中读取寄存器
再一次,调试器将在我们设置的断点处停止执行,也就是在我们指定的地址处。眼看我们就要大功告成了,但是要查看我们解密后的字符串,需要学习如何读取寄存器并将其值打印出来。
第一步很简单。下面,让我们一次性转储所有寄存器。
(lldb) register read
当我们处理64位架构时,我们所有的通用寄存器都以“r”开头:rax、rbx、rcx,等等。
当我们读取方法名称和参数时,相关的两个寄存器通常是rdi和rsi。第一个寄存器通常用于保存被调用的类的名称,而第二个寄存器通常用于第一个参数。请注意前面截图中的反汇编中,rsi是如何的rdi之前加载的。既然我们已经知道,这里处理的是基于rdi的NSString创建过程,那么不妨直接看一下通过rsi传递给“initWithstring:”的参数。
当我们想要打印或引用lldb中的寄存器时,我们必须在它们前面加上$符号。我们使用“po”(expression -O命令的简写形式)将寄存器的内容作为对象进行打印。
(lldb) po $rsi
现在,我们终于看到了unpack.txt文件中的加密字符串的真实面目。事实证明,这是一个将zip文件下载到临时目录的shell脚本。通过阅读mktemp的手册页我们知道,由“X”组成的字符串会产生一个具有相同长度的随机目录名。然后,该脚本会解压并启动下载的应用程序,并在启动时将参数s传递给它。
此时,如果您想继续执行而不跳转到另一个断点,可以通过next命令让lldb继续执行下一条指令,并继续以同样的方式考察其他反汇编代码和寄存器,从而全面分析该恶意软件的其他行为。
如何退出LLDB调试器
如果您想让恶意软件“展示”其余的行为,请在调试器中再次使用continue。由于我们没有设置任何断点,所以,它要么完成其执行,要么停止对decrypt方法的进一步调用。
如果您不希望恶意软件继续运行,则可以使用process kill命令来终止该进程。此外,您还可以使用quit命令退出低级调试器。
后续处理
如果您让恶意软件运行(假设它正在尝试连接的服务器仍处于活动状态),您可以使用该漏洞进入“兔子洞”,并开始对下载的porcupine.zip进行逆向分析。别忘了,熟能生巧!
注意:事实证明,porcupine.zip包含了一个已经被Apple的MRT工具所能识别的恶意软件。
在深入继续练习这些技能过程中,我们可能还需要一些额外的资源。除了本文中提供的许多参考文献之外,还可以考虑阅读本书,获取有关lldb的更全面深入的介绍。在解决二进制分析问题时,我最喜欢使用的工具之一便是radare2及其附带的工具套件,如rabin2、rax2和radiff2。需要说明的是:这些都是免费的,甚至还提供了一个免费的GUI前端,Cutter,对于那些不喜欢命令行的人来说,真是一大很好的选择!在商业产品中,专业macOS逆向工程师通常都是Hopper的粉丝。
小结
在本文中,我们介绍了如何建立一个安全的环境来测试macOS恶意软件,以及如何使用静态分析和动态分析来逆向分析Mach-O二进制文件。在最后一部分中,我们学习了如何以受控方式来执行代码、设置断点和读取CPU寄存器。希望本文对读者能够有所帮助!