写在前边
本文旨在为读者提供关于恶意样本分析的重要知识和技术。以下为本文的条例概述:
1.来源:
本文为笔者于自身工作期间进行关于恶意样本分析的内部培训、根据培训内容所整理的精选文章。完整内容将分为多篇在本公众号进行发表,欢迎大家关注。
2.使用目的:
本文仅供学术交流使用,旨在促进行业内的知识分享和合作。
3.发展和创新:
a.恶意样本分析领域不断发展和创新。
b.本文将介绍重要概念、工具和技术,帮助读者更好地理解和应对恶意软件的威胁。
4.鼓励学术交流:
我们欢迎读者对本文分享、提出反馈意见和讨论本文的内容。
通过以上条例的概述,本文将为读者提供系统的恶意样本分析知识,并促进学术交流和行业内的合作与发展。
静态分析与逆向工程是深入了解恶意代码的重要方法。下面对每个部分进行完善:
A、静态分析概述
静态分析是通过对恶意代码的静态属性(例如代码、文件结构等)进行分析来推断其行为和功能的方法。
它不需要实际运行代码,因此适用于对样本的初步分析。静态分析涉及反编译、反汇编、字符串分析等。
这种方法有助于识别代码中的恶意行为、资源和特征。
B、逆向工程的意义及其在样本分析中的应用
逆向工程是通过分析二进制代码或程序的执行过程,以还原源代码、设计和功能的过程。
在样本分析中,逆向工程可以揭示恶意软件的内部工作原理、算法和漏洞利用。
它允许分析员理解攻击者的意图、探查恶意代码的隐藏功能,并在恶意样本中寻找可能的后门和漏洞。
C、逆向工程的常用工具和技术
在逆向工程中,有一些常用的工具和技术可以帮助分析员进行深入的研究。这包括:
-
IDA Pro:流行的反汇编和逆向工程工具,用于分析和还原二进制代码。
网址:https://www.hex-rays.com/products/ida
*左右滑动查看更多
-
OllyDbg:用于Windows平台的调试器,帮助分析员跟踪代码执行并理解其行为。
-
Radare2:开源的逆向工程框架,支持多种架构和格式。
网址:http://rada.re
-
x64dbg
网址:http://x64dbg.com
-
Windbg
网址:https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit
*左右滑动查看更多
-
Hopper:一个商业反汇编和反编译器,可在OS X和Linux上运行
网址:https://www.hopperapp.com
-
Binary Ninja:一个商业化的反汇编程序,对自动分析任务特别强大
网址:https://binary.ninja
D、实际案例
从恶意代码中提取关键信息:
在一个实际案例中,假设您遇到了一个未知的恶意样本,您可以使用逆向工程技术来分析它。通过反汇编和代码分析,您可能会发现恶意样本中的关键算法、通信协议、命令与控制机制等。您还可以定位到可能的数据泄露点、漏洞利用部分或可能的恶意操作。这个过程有助于揭示攻击者的意图,并为进一步的对抗措施提供有价值的信息。
1、静态分析
逆向分析涉及很多,比如语言不一,单单语言就有C、JAVA、.NET、DLL等编写的程序,这里就先简单列举具体使用办法。
当处理一个可疑的编译可执行文件时,我们不太可能拥有样本的源代码,所以我们需要借助一些反编译工具:
EXE程序
我们这里以EXE为主来详细讲解。
IDA Pro
交互式反汇编器专业版(Interactive Disassembler Professional)。提供了市面上绝大多数的语言编写程序的反汇编功能,是一个静态反编译工具,针对分析人员它是不可缺少的。
FLIRT识别技术
IDA使用了一种叫做FLIRT(快速库识别技术)的技术来自动识别被分析的可执行文件中使用的库。
编译器通常在编译过程中直接将代码链接到二进制文件中,为此IDA提供了一套对应表,可以在我们使用时,建立一个数据库让其一一匹配上。很遗憾的是这个功能是跟随版本进行更新的。所以,在条件允许的情况下,请使用最新的IDA。
加载程序
根据位数使用相应的IDA对程序进行反汇编加载。
方式一:直接打开对应位数IDA会弹出让选择文件,选择需要调试的程序文件即可。
方法二:拖动需要调试的程序至IDA程序上,可直接加载。
加载成功后,主窗口会停留在流程图处(一般该流程图为程序入口):
静态字符串
Shift+F12打开string窗口,查看可疑的敏感字符串,不要小看该步骤,有时关键信息也存储为了常量,可以直接看到并定位,但是也不要过于依赖该功能,存储的字符串也可能是掩人耳目,请仔细确认。
找到敏感字符双击跳转到地址处,F5打开反汇编窗口,进行代码分析。
如示例中加载的为一道CTF中的逆向题目,查看字符串发现了well done字符串,从而定位了程序逻辑主函数。
Imports(函数引入列表)
程序都是通过函数来实现具体功能的,程序有些是自己定义的函数,当然不可能全都自己写每一个功能,时间成本和文件大小都不太现实。所以Win提供了一个动态链接库,每个程序都可以调用他来实现自己本身需要的功能,函数都是存储在DLL文件中,所以相当于查询引入的DLL文件中,有哪些函数被使用了,IDA支持查看引入表。
View-->open subviews --> Imports
打开可以看到程序调用的Win所提供的链接库的所有函数表,显示:地址(Address)、顺序(Ordinal)、函数名(Name)、库(Library)。
PS:可以看到该函数在程序中被调用的代码片段地址,以及此函数属于哪个DLL库,可以针对敏感的函数来实现定位主函数来分析恶意功能。
跟踪API
当我们看到可疑的函数时:
可以通过双击跳转至该函数,然后使用xref功能找到函数调用位置。
xrefs(函数引用)
xrefs窗口显示所有的函数引用。我们可以看到样本中对该函数的所有引用,选择一个引用双击进入这段代码。
汇编窗口
如果没有样本相应的背景、功能,研究这些代码是非常具有挑战性的,所以IDA对样本进行了分解,向我们展示了它帮助解析的说明、注释等相关细节。
分析代码
我们来简单分析一下这段汇编,指令有两个组成部分:操作数 操作数。
Mov eax, 0x6453
-
EAX是目的地(第一个操作数)
-
0x6453是源(第二个操作数)
在这里我们为什么要特意讨论一下如何解析汇编指令呢?分析确实是不可或缺的一部分,但是像上方举例的是一个单一的指令,而我们在分析样本时,都是关于函数、寄存器和条件跳转等等的内容放在一起。
像这种稍微复杂起来,我们对其分析过后又回碰到下一个,以此类推,脑瓜子不可能总是那么清醒,所以引申到下一个知识点。
增加备注
通过增加备注来描述各个跳转来记录我们的进展。
按 “ ;”分号键增加评论。
举例:自定义算法分析
此前看到的信息基本上都是愿意让我们看见的,不愿意看到的一般都是通过自己编写函数来实现,这里我们就需要走读代码来一点点剖析发现其中隐藏在程序里看似正常的代码。
以往应急中发现的一个自己定义的函数方式,用来隐藏自己调用了什么进程。
主要流程中,先定义了一个V6数组,后创建函数sub_401240,并传入了v6数组、10、50的值。
函数sub_401240反汇编代码如图二所示,分析可得出该函数作用为异或传入的V6,并返回结果。
对其算法代码还原,写出如下代码:
#include <stdio.h>
int sub1(int a1[10], int a2[10], int a3, char a4)
{
int result;
int i;
for (i = 0; i < a3; ++i)
{
a2[i] = a4 ^ a1[i];
result = i + 1;
}
for (int a = 0; a < 10; a++)
{
printf("%c", a1[0]);
}
printf("n");
for (int b = 0; b < 10; b++)
{
printf("%c", a2[b]);
}
return result;
}
void main()
{
int v6[10];
v6[0] = 96;
v6[1] = 71;
v6[2] = 92;
v6[3] = 86;
v6[4] = 94;
v6[5] = 94;
v6[6] = 1;
v6[7] = 0;
v6[8] = 18;
v6[9] = 50;
for (int b = 0; b < 10; b++)
{
printf("%c", v6[b]);
}
sub1(v6, v6, 10, 50);
}
*左右滑动查看更多
运行后得出Rundll32字符串。
众所周知,Rundll32为WIndows提供dll动态链接库的重要进程,他可以调用已知的所有dll,恶意程序使用Rundll的好处有,该程序为系统进程,权限高,且无法将其关闭。
Java程序
java恶意程序大多是class文件,主要针对服务器安装Apache服务的,毕竟能运行起来必需要jre。class文件也可以使用IDA进行查看,不过针对于class的特殊性,可以直接使用java对其代码还原。
jad
网址:https://varaneckas.com/jad/
这个工具笔者不清楚是不是java自己出品,但是这应该是支持最早的--1997,且简单操作,下载解压到java/bin目录下即可cmd命令操作。
jad.exe -r -d c:src -s java -8 c:classes***.class
其中
-r 表示恢复源文件的目录结构
-ff 表示将类属性定义放在类方法定义之前
-d 表示输出目录
-s 表示文件的扩展名
-8 表示防止乱码问题
c:src表示把编译好的class文件存放在C盘上的src文件夹里面并且存放在对应位置
c:classes***.class表示把位于C盘的classes文件夹中的所有class文件都反编译成java文件
*左右滑动查看更多
jd-gui
直接将class文件拖动到该程序,即可直接加载并反编译。
GDAE
该软件是近两年开发出来的交互式开源编译器,针对jd-gui多年未维护而挺出的有志之士,该程序不依赖java便可以支持apk、jar、class文件的反编译工作。
.NET程序
.NET Framework是微软开发的一个平台无关性的软件开发平台,与java类似,无论机器运行的是什么操作系统,只要该系统安装了.net框架,就可以运行.net可执行程序。
dotPeek
网址:https://www.jetbrains.com/decompiler/
*左右滑动查看更多
一个免费的.net逆向工具,可以将.net程序反汇编为等价的C#或者IL代码支持dll、exe、winmd文件的反汇编。由JetBrain出品,有较为良好的软件支持。
dnSpy
网址:https://github.com/0xd4d/dnSpy
是一个开源的.net调试器和汇编器。
2、 逆向调试
动态分析针对程序已经运行,后使用相应的调试器对进程进行附载,通俗的来说是寻找该进程在内存以及CPU寄存器上的数据区来进行分析,程序已经运行那么这就是最真实的代码,逃过了静态代码设计的弯弯绕绕的加密方式。
x64dbg
为什么选择x64dbg而不是经典的Ollydbg呢?主要原因是x64dbg可以同时支持32位和64位程序,而老款Ollydbg仅支持32位。当然,这两者在功能上大同小异,事实上,x64dbg是Ollydbg的延续。
支持32/64位
x64dbg可以处理32位和64位代码,为了实现这一点,它由两个独立的程序组成:
-
x32dbg 用于32位可执行文件
-
x64dbg 用于64位可执行文件
在整个工具的介绍中,我们通常会使用"x64"这个名称。
加载样本
同IDA一样有两个方法,当然了绝大多数软件都有这两种方法。
1、拖拽需要分析的样本文件的图标至x64dbg的图标上。
2、打开x64dbg程序,在文件>打开(F3)加载所需文件。
当加载可执行文件时,x64dbg通常在程序代码开始处暂停。这使我们可以决定在哪以及如何开始检测样本。
界面介绍
-
导入函数表
功能都是通过运行函数来实现的,那么我们需要找到函数表来针对的查看每一段的代码,载入程序后在主窗口按CTRL+N即可打开导入函数表,即可针对单个函数所在地址进行追踪。
这里注意程序在运行后中途暂停,再次进入函数表只会进入被暂停时的模块区域函数表。
-
断点
程序运行后会直接一路实现每一步功能,那么此时我们想要在关键代码跳转处查看信息,就要对其下断点,运行到此处就暂停。
设置断点的方式有很多,断点类型也不一样,常用的即为INT3断点也叫CC断点,在需要设置断点的函数入口处点击下图内红框区域内的反汇编代码便可以设置断点。
-
栈窗口
当我们在关键函数入口处让其暂停后,我们可以通过栈窗口看到上一个函数运行返回的值,以及待压入栈内的信息,如下图:将fast.exe程序拷贝到系统启动项目录。
-
数据窗口
数据窗口内的可视数据往往在静态调试时无法直接查看到,可能是通过一系列算法进行解密后才能得出,在动态调试就可以跳过这些情况,在代码运行时,我们追踪相应的寄存器地址内数据,就会看到恶意程序有意隐藏的shellcode或者一些字符串。
-
寄存器窗口
恶意程序的寄存器窗口内的数据多为瞬时数据,不会存储,所以调试需要认真的留意关键部分的寄存器变化。
-
命令窗口
我们对程序的操作都可以通过该处输入命令来实现。
-
句柄
指向位置。
确定位置。
转到x64dbg中的选项卡,找寻所需句柄。
-
跟踪调用函数
运行至函数入口。
我们希望查看这个函数在运行后的结果,选择函数后的test指令,右键选择运行到此。
观察堆栈内容。
我们观察函数的输出情况,在堆栈窗口中看到了函数运行后输出到内存中的返回值,这段内存地址中存在了一个可读的字符串。
解密文件内容。
uri=ads.php;exec=cexe;file=elif;conf=fnoc;exit=tixe;encode=5b;sleep=30000
*左右滑动查看更多
当我们把这段分析结合之前的行为观察,不难得出,这是一份配置,其中包含了C2的关键字,指定检索的网页,定义了循环周期,包括了一个编码格式。
API Monitor
附加程序,监控其API的调用,这个工具可以帮助我们发现样本传递给外部函数的参数,以及检查API调用的返回值。
设置监控。
在监控窗口中选择监控新进程,这样酒可以监控到样本从初始启动后的API调用。
如上图举例显示了样本调用CryptDecrypt后缓冲区内容。包含了程序在运行后解密的内容。
这和使用x64dbg进行分析的结果是一致的。它的好处是快速、方便。但是功能比较单一,无法像x64dbg一样对样本有更多的可见性和掌控力。
高级持久性威胁(APT)是针对特定目标的精心策划和长期执行的攻击,通常由高度组织的黑客或国家间的恶意行动者进行。以下是对每个部分内容的补充:
A、持久性威胁的特征和挑战
持久性威胁的特征包括长期执行、隐蔽性、高度目标化和使用先进的攻击技术。这些攻击通常旨在长时间内保持对受害者的访问权,以便窃取机密信息、监控活动或在需要时实施其他恶意活动。挑战在于,这些攻击往往不易被检测,因为攻击者会使用高度定制化的工具和技术,以逃避传统安全防御措施。
分析高级持久性威胁的方法和策略:分析APT攻击需要结合多种方法和策略,包括:
B、威胁情报分析
分析来自内部和外部来源的威胁情报,以获取有关攻击者的信息、目标、工具和技术的洞察。
-
行为分析:通过观察恶意活动的行为特征,尝试识别与常规活动不符的模式。
-
狩猎活动:主动地在网络中寻找已存在的潜在攻击迹象,以发现可能的未知威胁。
-
溯源分析:从攻击的初始入侵点开始,跟踪攻击路径以了解攻击者是如何移动和操作的。
C、检测和响应方法:从威胁情报到威胁狩猎
-
威胁情报:使用威胁情报来源,了解关于攻击者的信息,帮助识别并减轻APT攻击的威胁。
-
安全信息与事件管理(SIEM):使用SIEM平台来集中监视、检测和响应异常活动。
-
威胁狩猎:通过系统化地搜索网络中的潜在攻击迹象,寻找隐藏的APT活动。
-
网络分析:通过监控和分析网络流量,寻找异常模式和行为。
D、追踪并应对高级持久性威胁
在一个实际案例中,假设一个组织遭受了一次高级持久性威胁攻击。
通过分析威胁情报,发现攻击者可能是某国家的间谍机构,他们使用了定制的恶意软件。分析员结合行为分析和威胁狩猎技术,发现攻击者利用了一个已知的漏洞来入侵。
通过进一步的溯源分析,他们揭示了攻击者在网络中的移动路径,最终成功清除了攻击者,并修补了漏洞。
原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 《恶意样本分析实战》系列之手动分析技术(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论