恶意软件分析和逆向工程工作流
写在前面:恶意软件分析和逆向是一项非常专业的工作,要求极高的技巧和耐心,有一种顺藤摸瓜,抽丝剥茧的感觉。
2022年7月6日
我注意到有很多关于恶意软件分析和逆向工程过程的资料。然而,它们并没有真正覆盖某人从头到尾的工作流程。本指南将概述我的日常做法。
前提
- 确保您已经完成了恶意软件实验室的设置(作者有自己定制的恶意软件实验室,请参看原文)
- 这个指南并不是指每个人都要这样做,每个人都可改进自己的工作流程,适合他们持续工作。
方法
当处理恶意软件时,最好有一个方法来指导你的操作。如果没有一个整体的方法,你的工作就会陷入平淡,因为你没有目标。这是一个很酷的新兴领域,可以让你的公司看起来很棒,但与此同时,逆向工程非常耗时和昂贵。如果没有对整体的方向给予额外的关注,你可能会变得非常无效。那些不了解恶意软件分析和逆向工程所带来的技术挑战的人们认为,你可以在几个小时内给他们发送一份完整的恶意软件样本的逆向报告。我们有责任教育他们事实并非如此,因为事情往往比表面看起来要复杂得多。根据恶意软件样本的复杂性,可能需要几分钟、几小时、几天、几个月、几年,这真的要看情况!
根据你工作的地方,他们通常会采用不同的方法来制定这个过程的策略。因此,当本指南中描述的方法与其他地方不同时,不要感到惊讶。
目的和输出
在执行这样的分析时,您可以有许多目的:
- 检测签名
- 恶意软件配置提取器(智能)
- 自动解压包
- 跟踪威胁行为者
- 编写技术报告
当然,这种工作还有其他潜在的目的,然而,这些是大多数的情况。
行为
当分析恶意软件时,关注其行为是很重要的。这告诉我们,一旦恶意软件进入目标环境,我们可以预料它执行哪些操作。
端点
在端点上的行为包括但不限于以下属性:
- 创建进程
- 生成和删除文件
- 注册表键值
- DNS
- TCP通信
- 代码注入
网络
尽管在端点部分中有一些内容关于网络,但这一节是关于完整包检查的。这是恶意软件通信的方式,不仅仅是与某个域或IP地址通信,还包括通信的内容及其行为方式。
检测
我引以为豪的一件事就是能写出有意义的检测。想象一下,因为你感觉不舒服而去看医生。如果医生给你检查,只是确认你生病了,或者给你一个模糊的诊断,没有更多的细节,这就会造成糟糕的客户体验。在网络安全行业,我们可以将这种体验归因于VirusTotal防病毒检测名称。当我编写检测时,我创建了启发式签名和分类签名。这确保了我们可以在更大范围内捕捉到更多恶意软件,但也可以捕捉到我们已经知道的恶意软件,并将诊断提供给人们。
在执行这种检测方法时,我将重点放在工具,技术、战术和过程(TTP)上。下面所示的痛苦金字塔是一个很好的参考图。
对于像IP地址哈希值、域名和网络/主机这样的情报是很重要的。然而,这并不太取决于检测,它更多地在于一级SOC分析师验证观察到的行为,以及跟踪威胁行为者基础设施。
流程
当我们进行恶意软件分析和逆向工程时,重要的是要有一个流程来保持你的工作有条理。如果没有一个完整的流程,就很容易迷失或不得不重做已经完成的工作。
同样重要的是,我们认识到我们流程的时间复杂性。如果我们在金字塔的第一阶段就合理地实现了目标,那么你必须证明继续往上金字塔的花费是合理的。
时间复杂度
时间就是金钱,逆向工程代码需要很长时间,但可以带来额外的好处。同样,如果没有明确的方法和方向,你可能会浪费大量的时间和金钱。
概述
下图概述了我所遵循的一般流程:
恶意软件分析
恶意软件分析是一个对初始阶段进行分类的过程,以确保我们对稍后将用于逆向工程的样本有一个高水平的概述。这为我们节省了时间,因为它提供了可靠的情况说明。
识别文件类型
我们需要确定我们正在处理的文件的类型,因为它将帮助我们确定今后将使用的工具。
推荐工具
- Detect it Easy
- Linux file 命令
- Binwalk Sudo apt install -y binwalk
分析
恶意软件分析阶段对我来说描述了我们开始调查恶意意图的过程的一部分。这个过程包括使用静态和动态技术分析样本。然而,它是逆向工程前期的准备工作。
静态
在执行静态分析之前,我们必须能够理解它的含义。
静态程序分析是在不执行任何程序的情况下对计算机软件进行的分析,与此相反,动态分析是在程序执行期间对其进行的分析。—https://en.wikipedia.org/wiki/Static_program_analysis
这意味着我们在不执行样本的情况下执行分析。
推荐工具
- PEStudio
- PEBear
- Detect it Easy
- 7zip
- YARA
- VirusTotal
- MalwareBazaar
我们正在寻找清楚表明恶意意图的指标。
动态
在我们进行动态分析之前,我们必须能够首先理解它的含义。
动态程序分析是通过在真实或虚拟处理器上执行程序来对计算机软件进行分析。为了使动态程序分析有效,目标程序必须用足够的测试输入来执行,以覆盖几乎所有可能的输出。https://en.wikipedia.org/wiki/Dynamic_program_analysis
我喜欢做两种动态分析,第一种是自动动态分析。
对于自动化动态分析,我将把我拥有的样本提交给一个沙盒服务或我自己的沙盒系统。让我们首先通过下面的定义从高层次上理解什么是沙箱。
沙箱用于在将代码或应用程序提供给关键设备之前测试可能是恶意的代码或应用程序。在网络安全领域,沙盒被用作测试软件的一种方法,这些软件在测试后会被归类为“安全”或“不安全”。——Malware Bytes
既然我们已经理解了沙箱的含义,我推荐以下资源。
- AnyRun
- HybridAnalysis
- Cape Sandbox
- Triage
- Joe Sandbox
一旦您在沙箱中执行了这个示例,您将希望寻找恶意的意图。
另一种动态分析是在您自己的实验室机器上手动执行。要监视活动,您可以使用Wireshark之类的工具来监视网络,Procmon之类的工具来监视端点行为。这种类型的动态分析可以通过在网络上响应恶意软件来操纵恶意软件,或者将文件或其他软件放置在需要它们的地方以支持进一步的执行。
恶意动机
在我们完成静态和动态恶意软件分析后,我们需要指出样本是否具有恶意意图。如果我们确定它有恶意,我们就需要对任务做出一些决定。
- 请参阅目的和输出部分并完成所需内容
- 如果需要,逐步升级到逆向工程
恶意动机的其他参考。
- Mire
- LOLBAS
根据你的工作范围、标准操作程序和总体策略,你将需要决定是否完成这些任务。
注意:不是总有必要升级为逆向工程,它再次取决于您收到的工作范围和恶意软件的复杂性以及您需要的结果。所以这个过程可以完全到此为止!
逆向工程
逆向工程可以定义如下。
“逆向工程是一种过程或方法,通过它,人们试图通过演绎推理来理解之前制造的设备、过程、系统或软件是如何完成任务的,但却很少了解它究竟是如何完成任务的。——https://en.wikipedia.org/wiki/Reverse_engineering”
分类检查
这种分类与恶意软件分析的分类非常不同。逆向工程分类的目标是使用这些信息来帮助您识别恶意二进制文件中的关键兴趣区域。例如,如果恶意软件分析分类说明表明恶意软件使用ws2_32.dll进行通信,我们可以在二进制文件中查看这些API调用的交叉调用。
一旦我们确定了我们想要完成的任务,我们就可以进入下一步。
逆向
在这个阶段,我们开始对恶意软件进行逆向工程,通常我们会使用Ghidra、IDA Pro和DNSpy等工具来反编译二进制文件。
我们将使用这些反编译器来创建伪代码。
在计算机科学中,伪代码是一个算法或另一个系统中步骤的简单语言描述。伪代码通常使用普通编程语言的结构约定,但其目的是供人类阅读而不是机器阅读。
这段代码是原始代码的近似值。
我们有责任清理这些伪代码,使其更易于我们人类阅读。
这是一个完整的过程,我们不会在本工作流程指南中介绍这些具体的原则。我们将在逆向工程指南中介绍这个内容。
完成后,请参考目的和输出部分并完成所需内容。
提示和技巧
这里有一些基本的建议和技巧可以帮助你在这个过程中保持条理。
标准化分析文件夹结构
当我开始一个这样的新任务时,我会创建一个包含以下结构的文件夹。
- Docs -一个文件夹,包含从公开文章到自己的笔记的文档
- Pcaps -抓包文件
- 样本-分析的样本,可能包括多个阶段
- 脚本-帮助我自动化流程的脚本
- 项目-包含Ghidra, IDA等项目文件
有了这个文件夹结构,我就能知道我在哪里,我要去哪里。
标准化反编译器代码样式
当我在Ghidra或IDA Pro中工作时,标准化伪代码中函数和变量的命名是很重要的。我个人认为这与操作系统的编程指南的标准是一致的。这确保了文档和样式指南易于访问和被每个人理解。
注解
当使用Ghidra, IDA Pro或任何其他工具,允许您作出注解。这会让你有条理,让你知道自己在哪里。如果你正在使用的软件有记录笔记的功能,那就好好利用它。
记笔记
当我完成这些过程时,我会做笔记,通常是用笔记的形式来让自己有条理。可以使用许多不同的工具来实现这一点。不过,我现在用的是Obsidian,因为它有很多不同的功能。
结论
当你第一次开始工作时,即使是开始理解某人的工作流程从头到尾都可能是一项令人生畏的任务。希望本指南能帮助您创建自己的工作流程,这对你来说很有意义。
