配套文件:
https://pan.xunlei.com/s/VN32i8rpCaxZaVnkaBdMj02iA1
提取码:h2qi
Lab1-1
2. 这些文件是什么时候编译的?
在PE文件中,IMAGE_NT_HEADERS > IMAGE_FILE_HEADER > Time Date Stamp字段记录了文件编译时间。利用 010 Editor 打开exe文件和DLL文件,找到相应字段如下:
可知exe文件编译时间为2010.12.19 16:16:19
3. 这两个文件是否存在迹象说明它们是否被加壳或混淆?
利用PEiD检测两个文件的加壳情况:
可知两个文件都无壳,未被混淆。
4. 是否有导入函数显示出了这个恶意代码是做什么的?
利用StudyPE查看exe文件和DLL文件:exe文件导入两个模块(KERNEL32.dll和MSVCRT.dll),在导入地址表(IAT)中可以看到模块导入的函数。发现有创建文件函数CreateFileA,查找文件函数FindNextFileA,复制文件函数CopyFileA,创建文件映射函数CreateFileMappingA。
DLL文件中IAT可以看到有Sleep函数,创建进程函数和创建互斥体函数CreateProcessA、CreateMutexA。其中导入的WS_32.dll是为网络所用的文件。
5. 是否有任何其他文件或基于主机的迹象,让你可以在受感染系统上查找?
利用IDA查看exe文件字符串(View->Open Subviews_>String \ Shift + F12)
可以看到有两个相似的DLL:kerne132.dll和kernel32.dll。推测恶意代码劫持kernel32.dll。
6. 是否有基于网络的迹象,可以用来发现受感染机器上的这个恶意代码?
利用IDA查看DLL文件字符串。
结合WSS_32.dll推测可能连接到这个IP地址,sleep函数是用来后门程序休眠。
7. 你猜这些文件的目的是什么?
通过GetProcess和Sleep函数设置后门,exe加载运行dll,其中dll是后门程序。
Lab 1-2
2. 是否有这个文件被加壳或混淆的任何迹象?
就像Lab1-1中利用PEiD查看Lab01-02.exe
可以看出EP段已被混淆为UPX1,将PEiD中选项设置为核心扫描则可以发现被加了upx壳。UPX是一个压缩器,操作简单、功能强大,且完全免费,受很多人的青睐。进入http://upx.sourceforge.nt 网站,下载“Win32 Console Version” 后在命令行窗口可对可执行文件进行加脱壳操作(《逆向核心原理》中有关于UPX加脱壳的详细介绍)。
使用上述命令对Lab01-02.exe进行脱壳。
3. 有没有任何导入函数能够暗示出这个程序的功能?
利用StudyPE查看脱壳后的Lab01-02_U.exe,发现导入了四个模块,观察IAT。有对互斥体进行操作的函数OpenMutexA、CreateMutexA函数;InternetOpenA和InternetOpenUrlA说明程序会打开一个链接;CreateServiceA、StartServiceCtrlDispatcherA、OpenSCManagerA是创建服务相关函数。
4. 哪些基于主机或基于网络的迹象可以被用来确定被这个恶意代码所感染的机器?
使用IDA加载Lab01-02_U.exe后查看字符串:
发现一个服务名MalService,一个网络链接,一个浏览器类型。可以通过监视网络流量检查被恶意代码感染的主机。
Lab 1-3
2. 是否有这个文件被加壳或混淆的任何迹象?
通过使用PEiD查看exe文件发现被加壳,加壳方式是FSG 1.0。脱壳部分我还没掌握。
Lab 1-4
2. 是否有这个文件被加壳或混淆的任何迹象?
PEiD查看后无壳。
3. 有没有任何导入函数能够暗示出这个程序的功能?
pe工具查看exe文件。AdjustTokenPrivileges、LookupPrivilegeValueA、OpenProcessToken为权限操作相关函数。CreateFileA、WinExec、WriteFile表明程序将创建一个文件并执行。
4. 有哪些基于主机或基于网络的迹象,可以被用来确定被这个恶意代码所感染的机器?
使用IDA加载exe文件查看字符串引用:
通过对导入函数的分析,再结合字符串信息,猜测wupdmgr.exe和winup.exe为恶意程序创建的可执行文件。
总结
拿到恶意程序文件后,先上传到VT匹配病毒软件特征;再判断文件是否被加壳,若存在壳则需要脱壳后再进行分析;根据文件的导入函数、字符串的引用来对恶意程序行为做一个大方向的推断。以上分析行为都为静态分析。
Lab 6-1
1. 由main函数调用的唯一子过程中发现的主要代码结构是什么?
如上一节总结所言:拿到恶意样本后首先判断是否加壳;然后查看pe文件的导入表,查看有无敏感函数。
使用peid查看Lab06-01.exe后发现没有进行加壳,使用StudyPE查看后发现InternetGetConnectedState函数。使用IDA打开Lab06-01.exe后如下:
main函数中的唯一子过程即为sub_401000,双击进入后发现:首先开辟栈帧,然后压入InternetGetConnectedState函数所需参数,调用函数后对函数返回值进行判空操作。整体可以看出是一个if语句。
2. 位于0x40105F的子过程是什么?
从上图可以找到sub_40105F,并且在if语句的两个执行分支都有call sub_40105F命令,并且该指令上方都有字符串压栈操作,所以可以推断0x40105F的子过程为打印输出。
3. 这个程序的目的是什么?
程序的关键在于调用InternetGetConnectedState函数并对其返回值进行判断。InternetGetConnectedState函数返回本地系统的网络连接状态。所以推断该程序判断本地网络情况并输出。
Lab 6-2
1. main函数调用的第一个子过程执行了什么操作?
调用的第一个子过程既call sub_401000,进入sub_401000后发现为6-1中分析的调用InternetGetConnectedState函数操作。
2. 位于0x40117F的子过程是什么?
同6-1中第2问。
3. 被main函数调用的第二个字过程做了什么?
main函数调用的第二个字过程既call sub_401040,进入sun_401040后发现调用了很多网络相关的函数:InternetOpenA、InternetOpenUrlA、InternetReadFile以及相应的关闭句柄函数,并且利用if语句进行判断。并且在InternetOpenUrlA函数上方有对字符串"http://www.practicalmalwareanalysis.com"的压栈操作。所以判断该过程是打开前述链接并利用InternetReadFile函数读取信息。
4. 在这个子过程中使用了什么类型的代码结构?
典型的if语句。识别汇编语言中的C代码结构。
5. 在这个程序中有任何基于网络的指示吗?
使用IDA查看字符串引用:
并且在3问中已经发现有调用与网络相关的API函数。
6. 这个恶意代码的目的是什么?
在401040之后,进入到40115C中,该处有对字符串打印输出操作和调用Sleep操作,从而判断程序首先检查本地网路情况,在确定网络正常之后打开恶意链接并读取信息,然后进行休眠。
Lab 6-3
1. 比较在main函数与实验6-2的main函数的调用。从main中调用的新的函数是什么?
通过在IDA中的比较发现为call sub_401130。
2. 这个新的函数使用的参数是什么?
在0040124E--00401253处,可以看到是对参数lpExistingFileName([ebp+argv])的压栈操作;在00401254--00401257处,是对参数char([ebp+var_8])的压栈操作。
3. 这个函数包含的主要代码结构是什么?
不难看出是switch语句,并且是基于跳转表的方式被编译,应有5个case。识别汇编语言中的C代码结构
4. 这个函数能够做什么?
首先看到cmp+ja组合,将[ebp+var_8]与4比较,若小于等于4则进入case。首先看case1:
case1中调用了CreateDirectoryA函数,call指令上方压栈的0和字符串都是该API函数的参数,作用即为创建文件夹。再看case2:
cong压栈操作可以看出CopyFileA函数共有三个参数,作用既是将一个现存的文件(既参数lpExistingFileName,[ebp+lpExistingFileName]的内容)复制到C:\\Temp下cc.exe。
case3中调用DeleteFileA函数删除Data中的文件,既删除C:\\Temp下的cc.exe。
case4中为打开并设置注册表,向Software\Microsoft\Windows\CurrentVersion中的Run子键写入Malware项并设置为cc.exe,向Run子键中写入项是普通的设置程序自启动方法。
case5即为休眠操作。
5. 在这个恶意代码中有什么本地特征吗?
6. 这个恶意代码的目的是什么?
通过switch语句进行复制文件、删除文件、修改注册表以及休眠操作。
Lab 6-4
1. 在实验6-3和6-4的main函数中的调用之间的区别是什么?
开辟栈帧的大小变大了,在6-3的mian函数中开辟的大小的 sub esp ,8。
2. 什么新的代码结构已经被添加到main中?
for循环
var_C被初始化为0,将var_C与5A0h比较,若小于则进入左侧流程,在loc_401251中对var_C进行自增1后再与5A0h比较。
Lab 7-1
1. 当计算机重启后,这个程序如何确保它继续运行(达到永久化驻留)?
IDA加载恶意文件后分析主函数:
可以看到主函数调用了StartServiceCtrlDispatcherA函数,该函数将服务进程的主线程连接到服务控制管理器,使该线程成为调用进程的服务控制调度线程。并且指定了服务名和服务线程分别为"MalService"和sub_401040。进入 sub_401040函数查看:
首先看到对互斥量操作的函数,互斥量是全局对象,用于协调多个进程和线程。同一时刻, 一个线程只有一个互斥量。在0x00401052处调用OpenMutexA函数来检查名为HGL345的互斥量是否存在,通过test+jz指令判断,若返回值不为零则表示互斥量存在,调用ExitProcess结束进程;返回值为空进入loc_401064处,如下:
使用CreateMutexA函数创建名为HGL345的互斥量,使用OpenSCManagerA函数返回一个服务控制管理器的句柄,GetCurrentProcess用来获取当前进程的一个伪句柄,GetModuleFileNameA函数获取当前进程已加载模块的文件的完整路径,CreateServiceA函数添加一个新服务到服务控制管理器,注意这个函数的参数:lpBinaryPathName和dwStartType如下
lpBinaryPathName参数的由来应该就是GetModuleFileNameA所得路径;dwStartType被push 2,表示该服务在系统启动时由服务控制管理器自动启动。继续向下走:
SystemTimeToFileTime将系统时间转换为文件时间格式,CreateWaitableTimerA创建一个可等待的计时器对象,SetWaitableTimer实现定时功能,WaitForSingleObject被线程用来访问互斥量。
WaitForSingleObject返回值若为空,则使用CreateThread创建线程,注意CreateThread的lpStartAddress参数,进入0x0040112C处的StartAddress查看:
可以看出这应是一个死循环,不停的访问"http://www.malwareanalysisbook.com"。从而可得知在0x00401135处创建的线程的功能。再观察loc_401126处可以发现是一个for循环结构,循环次数为20次(mov esi, 14h)。最终程序执行Sleep休眠操作。
2. 为什么这个程序会使用一个互斥量?
同一时刻, 一个线程只有一个互斥量,保证了只有一个实例在运行。
3. 可以用来检测这个程序的基于主机特征是什么?
互斥量名"HGL345"(互斥量对恶意代码分析很重要,因为它们经常使用硬编码的名字,将它们作为基于主机的感染迹象是很好的选择);服务"MalService"。
4. 检测这个恶意代码的基于网络特征是什么?
5. 这个程序的目的是什么?
通过xor指令将edx清零,SystemTime.wYear初始化为2100(834h),可知定时设置为2100年。
在问题1中分析到的访问 "http://www.malwareanalysisbook.com"的死循环、for循环创建线程,以及SetWaitableTimer等定时函数可得知,程序在2100年对上述网站实施DoS攻击。
6. 这个程序什么时候完成执行?
程序不会终止。
Lab 7-3
对于Lab07-03.exe,首先查看其字符串:
在这里注意到一个kerne123.dll,是数字1而不是字母l。然后在查看exe文件的带入表:
注意到有文件映射函数和文件查找函数。
对于Lab07-03.dll同样进行上述初级静态分析:
有两个字符串和一个IP地址。导入表如下:
有创建进程和创建互斥量函数。
初级静态分析收集的信息大概就是这么多,接下来利用IDA分析两个文件。IDA打开exe文件后首先能看到参数个数比较:
若参数有2个,则进入loc_401813执行;否则向下执行:
这部分首先将参数传递为eax,将字符串"WARNING_THIS_WILL_DESTR OY_YOUR_MACHINE" 传递给esi,之后循环比较参数和"WARNING_THIS_WILL_DESTR OY_YOUR_MACHINE"。从而推测Lab07-03.exe正确执行命令为:Lab07-03.exe WARNING_THIS_WILL_DESTROY_YOUR_MACHINE 。继续往下走:
此处的CreateFileA函数有的帖子写的是创建文件,但是注意看dwCreationDisposition参数,该参数值为3表示仅当文件或设备存在时才打开它,所以 CreateFileA函数应该是应是打开C:\\Windows\\System32\\Kernel32.dll并返回其句柄。
CreateFileMappingA函数为指定文件创建或打开命名或未命名文件映射对象,如果函数成功,则返回值是新创建的文件映射对象的句柄。其中参数hFile的值既是CreateFileA函数返回的句柄(push eax),所以推测此处创建C:\\Windows\\System32\\Kernel32.dll的文件映射对象。
同样,MapViewOfFile将Kernel32.dll映射视图映射到调用进程的地址空间。继续走:
这时看到了另一个文件"Lab07-03.dll",所进行的操作与Kernel32.dll一样,通过使用CreateFileA、CreateFileMappingA和MapViewOfFile函数将Lab07-03.dll映射到进程地址空。之后出现一片局部变量的比较,直接跳过往下看调用的API函数:
通过hObject发现此处调用了三次CloseHandl函数来关闭Kernel32.dll打开的句柄,使用CopyFileA将Lab07-03.dll复制到C:\\Windows\\System32\\Kerne132.dll。注意,此时的Kerne132.dll的1是数字。往下走:
此处压入C盘根目录字符串参数,调用sub_4011E0函数,进入sub_4011E0函数分析:
此处看到FindFirstFileA函数,以及在最后的FindNextFileA函数,并且FindNextFileA还在一个循环内,所以推测sub_4011E0函数是在C盘下查找某一文件。既然是查找文件,避免不了字符串的生命,从而在sub_4011E0函数内注意字符串的引用。
看到有两个字符串的压栈操作,分别是".exe"和String1,往下看是调用了_stricmp函数:
若两字符串相同则进入loc_40140C,不同则调用sub_4010A0函数。进入sub_4010A0分析:
通过使用CreateFileA、CreateFileMappingA和MapViewOfFile函数将文件l映射到进程地址空。后面又看到字符串比较:
将"Kernel32.dll"与String1比较,若相同则下面就执行repne scasb以及rep movsd指令,rep movsd会将esi中的内容覆盖到edi中。其中esi中的内容就是dword_403010,也就是参数String1,双击dword_403010进入后按键盘A键后发现:
此时看到伪造的Kerne132.dll,从而推测,这个恶意程序其实会搜素C盘中的所有.exe程序,将这些程序的导入表中的kernel32.dll修改为kerne132.dll,这样一来,每当这些exe程序运行的时候,就会自动加载恶意.dll程序,实现后门的功能。