Lab 11-1
1. 这个恶意代码向磁盘释放了什么?
首先peid查壳后发现无壳,IDA打开Lab11-01.exe分析。发现调用了GetModuleHandleA函数并且参数为0,所以函数的返回值就是Lab11-01.exe文件的句柄。并且在0040120F处将得到的句柄作为参数,调用了sub_401080函数。
跟进sub_401080函数分析,发现首先有对句柄参数的判空。
继续向下分析,发现利用了多个资源相关的API函数,并且确定Lab11-01.exe文件的位置以及大小。StudyPE打开Lab11-01.exe文件,查看资源窗口。发现在TGAD节中包含一个PE文件。
在确定大小后使用VirtualAlloc分配内存空间,并且分配的保护为PAGE_READWRITE。
然后使用_fopen在Lab11-01.exe同目录下创建一个名为msgina32.dll的文件,根据参数Mode可知该文件允许写数据。又调用了_fwrite对msgina32.dll进行写操作。
静态分析至此大概可知程序释放了什么文件,OD中在0040116B调用_fopen函数处下断点,单步步过后检查Lab11-01.exe所在目录。
2. 这个代码如何进行驻留?
在释放DLL文件之后,使用GetModuleFileNameA获取其所在路径。在00401288处将DLL路径作为参数,调用sub_401000函数。
跟进sub_401000函数分析,可见使用RegCreateKeyExA、RegSetValueExA函数在注册表SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下创建了一个名为GinaDLL的项,并且GinaDLL的值即为释放的DLL文件。
静态分析至此。OD中在00401047调用RegSetValueExA函数处设置断点,单步步过后查看SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon注册表下的值。
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL作为Windows用来存储Winlogon加载的第三方DLL,恶意代码利用这一点实现GINA拦截。所以可知程序通过增加注册表项来实现驻留:将释放的msgina32.dll作为GINADLL安装,系统重启后msgina32.dll会被加载。
3. 这个恶意代码如何窃取用户登陆凭证?
现在可以判断出,msgina32.dll作为GINA拦截器。恶意文件msgina32.dll在Winlogon和msgina.dll之间工作(类似于中间人攻击),此时恶意代码能够拦截提交给系统的所有登陆凭证。
同时如书中所言,msgina32.dll拦截了两者之间的通信,为了能够让系统正常运行,它必须将登陆凭证传递给msgina.dll。从而拦截器msgina32.dll必须包括msgina.dll的所有导出函数,也就是必须超过15个导出函数并且大部分前缀时Wlx。
Lab 11-3
1. 使用基础的静态分析过程,你发现了什么有趣的线索?
首先对Lab11-03.exe查壳,发现无壳后使用Strings查看字符串。
发现“C:\WINDOWS\System32\inet_epar32.dll”,“net start cisvc”,“cisvc.exe”字符串,使用StudyPE查看可执行文件的导入表,发现复制文件函数。
对Lab11-03.dll文件进行查壳,无壳后同样查看其字符串。又出现一个文件路径“C:\WINDOWS\System32\kernel64x.dll”。
查看Lab11-03.dll导入表,发现击键记录函数GetForegroundWindow、GetAsyncKeyState函数。
2. 当运行这个恶意代码时,发生了什么?
利用进程监视器Process Monitor,设置过滤条件后运行Lab11-03.exe。发现有创建inet_epar32.dll和cisvc.exe的操作(实验环境为Win10x64_15063)。
IDA打开Lab11-03.exe分析,主函数利用CopyFIleA函数将同目录下Lab11-03.dll复制到C:\\WINDOWS\\System32\\inet_epar32.dll。利用_sprintf函数获得cisvc.exe所在路径,既:C:\WINDOWS\System32\cisvc.exe。并将该路径作为参数,调用了sub_401070函数。
跟进sub_401070函数分析,该函数为cisvc.exe创建文件映射对象并将其加载到进程地址空间。
其中00401100处lpBaseAddress就是MapViewOfFile函数所返回的cisvc.exe文件映射对象在进程地址空间中的起始地址。
在0040127C处对cisvc.exe文件进行操作:首先调整内存地址偏移,然后通过mov esi, offset loc_409030、rep movsd将loc_409030处内容写入到cisvc.exe中;也等同于memcpy函数,这也是为什么只能看到对cisvc.exe的CreateFileA操作却看不到WriteFileA操作。
跟进loc_409030处按C转换为代码查看。
可以看出这是一段shellcode,跟进loc_409134查看。
在这里看到了恶意代码copy的DLL文件,以及该函数的导出函数。
再回到主函数。
在对sub_401070调用完成后,使用_system发出DOS命令:“net start cisvc”。
Lab11-03.exe首先将Lab11-03.dll复制到C:\\WINDOWS\\System32\\inet_epar32.dll,然后将C:\WINDOWS\System32\cisvc.exe文件修改后,映射到Lab11-03.exe进程中。IDA接下来分析被修改的cisvc.exe。
01001B2C处调用了sub_1001AD5函数,跟进分析。
前3个call都没有获取到有效的信息,但是第4个call时并没有显示函数名,可能被恶意代码修改。OD中加载cisvc.exe,在01001B0A处下断点单步步过后分析。
发现该处调用的函数是LoadLibraryA,注意01001B0A处上方的push eax,这是LoadLibraryA的参数。根据寄存器窗口中eax的值,在内存窗口中发现:
所以可知被修改的cisvc.exe所做的就是加载inet_epar32.dll的导出函数zzz69806582。接下来继续再下两处call下断点,分析如下:
再函数尾部01001B27处,jmp到了程序入口点。恶意代码通过程序入口点重定向来实现(inet_epar32.dll)Lab11-03.dll的长期驻留。
5. Lab11-03.dll做了什么?
IDA打开Lab11-03.dll,定位到导出函数分析。
跟进1000154A处offset StartAddress分析, 创建名为“MZ”的互斥量和名为"C:\\WINDOWS\\System32\\kernel64x.dll"的文件。
跟进sub_10001380函数分析,可知发现这是一个循环。并且在循环内部调用了sub_10001030函数、_sprintf字符换拼接函数、WriteFile函数、Sleep函数。
跟进sub_10001030函数分析,首先调用的sub_10001000既是对函数的调用。接下来又发现了循环和大量的GetAsyncKeyState函数。
所以可以推断,恶意代码实现击键记录,并将记录写入C:\\WINDOWS\\System32\\kernel64x.dll