恶意代码分析实战Lab11
恶意代码分析实战Lab11
Lab11-1
strings
可能存在窃取用户登录凭证
peid
资源操作
注册表操作
source hacker查看资源
有PE文件
导出二进制文件为exe
peid打开发现是dll文件
然后改名为dll文件
使用process monitor 分析
注册表查看
1.这个恶意代码向磁盘释放了什么?
msgina32.dll
2.这个恶意代码如何进行驻留?
查看提取的和释放的dll文件md5是否一致
提取的
释放的
一致
程序被写入到GinaDll重启会自动加载
3.这个恶意代码如何窃取用户登录凭证?
strings分析提取的dll文件
有很多Gina函数,有格式化字符串可能用来记录凭证
还有msutil32.sys文件
ida打开dll
判断程序是否在加载时调用
如果是
GetSystemDirectoryW 获取目录
lstrcatW 组合目录
LoadLibraryW 加载调用
这里的MSGina实现真实的功能
查看导出表
进入函数
WlxLoggedOnSAS
GetProcess获取真实的Gina
WlxLoggedOutSAS 系统注销时调用
进入函数
将时间,日期,打印等信息写入到msutil32.sys中
使用Ginan拦截用户的登录凭证
4.这个恶意代码对窃取的证书做了什么处理?
msutil32.sys 用户名,密码、时间,日期都记录在这个文件里
5.如何在你的测试环境让这个恶意代码获得用户登录凭证?
重启虚拟机输入密码
Lab11-2
strings lab11-02.dll查看
strings 查看ini文件
文件被加密
dependency walker 查看
CreateToolhelp32Snapshot
用于给当前进程或线程拍摄快照
注册表操作
1.这个恶意DLL导出了什么?
installer
2.使用rundll32.exe安装这个恶意代码后,发生了什么?
dll文件不能直接监控所以要监控rundll32
运行时跟上参数
rundll32.exe Lab11-02.dll,installer
创建了文件
spoolvxx32.dll
md5对比相同
系统目录中复制了文件
3.为了使这个恶意代码正确安装,Lab11-O2.ini 必须放置在何处?
程序试图打开这个文件,但文件未找到
将Lab11-O2.ini放到c:\windows\system32下即可
4.这个安装的恶意代码如何驻留?
在注册表里添加了恶意程序
5.这个恶意代码采用的用户态 Rootkit技术是什么?
ida分析lab11-02.dll
重命名和更改注册表
分析1000105b函数
获取系统路径
将系统路径和Lab11-02.ini进行拼接尝试打开ini文件,如果可以打开则读取
将读取的文件内容作为sub_100010B3参数传入(可能是解密)
将lab11-02.dll和ini文件拖入这个路径,然后lab11-02.dll改名为spoolvxx32.dll
od打开ldd文件跳转到解密函数
下断点后运行,查看参数发现无法识别的
ctrl+g
f2
f9
查看解密结果,是个邮箱
将函数重命名为email address
hook安装
内联hook原理
函数10001075返回绝对路径
函数10001104提取路径内容
确定程序名是不是(THEBAT.EXE OUTLOOK.EXE MSIMN.EXE)中的一个,不是结束,是的话看loc_10001561
观察发现sub_100013BD和sub_10001499函数及其相似,他们都会查找当前进程的所以线程,只是对线程的处理方式不一样,一个是挂起除了当前线程外的其他线程,一个是唤醒其他线程.
好了,现在只剩下最难的sub_100012A4,牢记这四个参数,都很重要
进入程序,头三个函数调用很明确,加载wsock32.dll,然后得到send函数地址
接着调用sub_10001203(三个参数,其中第一个是send函数地址)
程序的头尾都调用virtualprotect,一个是修改send代码区域可读写,一个是恢复原来的保护
这段代码把原来send函数的头五个字节保存在申请的内存空间
这段代码是对原来send函数代码的修改(我对一些参数和局部变量重命名,为了更好理解)
首先要注意三个地址,一个是lp_send_address这是send原函数的地址,一个是p_p_sub_1000113d地址他是函数1000113d的地址(这个函数会在send之前被调用,也就是说send函数被这个函数挂钩了),还有一个malloc_space这是临时申请的内存空间地址(他会被用来存放原来send函数的头五个字节和一个跳转命令)
一个一个来,看第一个E9h的赋值语句,E9就是jmp,E9被赋值给malloc_space的0a偏移处,第二个eax被赋值到偏移0b处(这两个语句中edx和ecx都是malloc_space)很明显这是跟在jmp后面的一个相对地址,他的值是send的原函数地址相对于malloc_space 0a偏移处的地址大小(这条jmp语句的执行效果就是跳转到被修改后的send函数的第一个一句jmp(jmp是5字节)后的代码,想一下eip的计算就知道为啥,eip=原eip+该汇编代码字节数(jmp是5字节)+jmp后面跟的相对地址).
上面是对malloc_space的一系列操作,下面是对原send函数的操作,同样是修改第一个字节为E9,然后第二个字节开始是ecx这里的ecx是挂钩函数sub_1000113d的地址(很明显是把send的头五个字节改成jmp sub_1000113d)
看最后的操作,把malloc_space偏移为5(为啥偏移为5看上面memcpy)的地址赋值给sub_10003484,这样call sub_10003484,就会执行原send函数头五字节汇编代码,然后跳回send继续执行剩下的send代码.
挂钩分析完毕,现在只剩下,挂钩函数sub_1000113d了,关键在于两个memcpy
复制RCPT TO: <到dst
头两个push是memcpy的参数,strlen的参数是第三个push,把src复制到dst这里的src是之前翻译出来的邮箱地址
最后把send的四个参数传给10003484,det就是消息,eax是长度,s是套接口描述字
说了这么多,其实就是在我们发邮件的时候,添加一个收件人,这个收件人就是上面提到的的邮箱地址
分析结束(几个虚拟机都没有outlook这几个软件就没有抓包,演示了)
使用的技术是内联hook
6.挂钩代码做了什么?
添加邮件发送目标,窃取邮件内容
7.哪个或者哪些进程执行这个恶意攻击,为什么?
THEBAT.EXE、OUTLOOK.EXE、MSIMN.EXE
8.ini文件的意义是什么?
加密恶意邮件地址
9.你怎样用Wireshark动态抓获这个恶意代码的行为?
恶意程序加载到内存后outlook发送邮件,wireshark监控到发送的收件人里多出一个新的收件人
Lab11-3
1.使用基础的静态分析过程,你可以发现什么有趣的线索?
strings exe程序
启动服务 cisvc
strings dll程序
查看dll文件,键盘记录
2.当运行这个恶意代码时,发生了什么?
创建了inet_epar32.dll文件
对比实验文件的dll和这个文件的md5
一致
3.Lab11-03.exe 如何安装Lab11-O3.dll使其长期驻留?
分析.exe程序,程序先复制lab11-03.dll到inet_epar32.dll,然后得到cisvc.exe的绝对路径,然后调用sub_401070函数,接着就是调用_system来启动cisvc程序,所以我们猜测关键在于sub_401070函数对原cisvc文件做了什么事,进入sub_401070,可以看到开头几个函数调用事打开cisvc,然后映射到内存,以便后面的修改操作.一直到下面的函数调用sub_401000
看sub_401000参数一个是节区数目3,一个是第一个节区名.text,函数其实是在查找.text节区头的头8字节是否具有内存访问权限,以便后面修改,并且返回.text节区头的地址
接着的是一系列的内存操作很难一步步理解,最好是直接跳过不要陷入细节,看关键的赋值
直接动态看结果,是在如下图地方的末尾添加了一串的东西
接着看,这句话是在修改程序的入口地址为1A28
用PEview打开被修改后的cisvc也可以证实,程序入口点正是被修改到,上面添加的那一段代码处
现在只需要看一下这段代码是什么,就知道.exe文件到底干了什么坏事,用ollydbg跟随cisvc程序,到下图地方可以发现程序动态加载了inet_epar32.dll也就是lab11-03.dll文件,这就是lab11-03.dll的长期驻留方式
现在我们开始分析lab11-03.dll,关键看一下导出函数和dllmain
可以看到dllmain没做什么内容,再看导出函数创建了一个线程就结束了,看来这个线程函数很关键,查看startaddress
可以看到创建了互斥量MZ,然后打开互斥量来确定只有一个恶意线程在运行,然后创建C:\WINDOWS\System32\kernel64x.dll文件,接着SetFilePointer明显是要对上面的文件进行读写操作了,接着是函数调用
跟进就看到一个函数调用,跟进发现这个程序很大,大致浏览一下,看个几个关键字符串和关键函数有很多的getasynckeystate调用还有getforegroundwindow函数可以推测很可能是击键记录.并且传递的参数是之前传递的参数四个buffer可能用来装,击键的记录数据
再看后面两个函数调用,一个_sprintf是对buffer的写,一个是把,buffer写到文件kernel64x.dll,注意write参数有个ecx+80ch正好指向了var_4,而var_4之前被赋值为文件kernel64x.dll指针,所以是把buffer写到kernel64x.dll
现在我们运行一下程序,然后测试一下,可以看到已经记录了很多的信息,但是记录的数据还是16进制的不太好理解记得0x54我打的应该是t键
4.这个恶意代码感染 Windows系统的哪个文件?
cisvc.exe
感染前后对比
将程序里所隐藏的shellcode复制到cisvc.exe里
关于修改的前两个字节
感染前程序入口点
感染后程序入口点,运行程序时会先执行shellcode
od调试
程序入口点
断点在01001b0a
kernel32.loadLibraryExA用于将dll文件加载到内存
01001b1b用于获取导出函数地址
最后执行到程序正确的入口地址
5.Lab11-03.dll做了什么?
主要分析导出函数zzz69806582
创建了一个线程
主要看StartAddress
创建互斥量避免线程冲突
获取文件创建句柄
函数SetFilePointer
dwMoveMethod的值为2表示指向文件末尾
循环调用
进入10001000
GetForegroundWindow 识别当前聚焦的前端窗口,告诉键盘记录器当前哪一个窗口正在执行输入
GetWindowTextA 获取窗口标题
在sub_10001030里
GetAsyncKeyState 用来识别当前按键是被按下还是弹起
键盘记录
6.这个恶意代码将收集的数据存放在何处?
参考
https://blog.csdn.net/abel_big_xu/article/details/117633708?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165855916616782246461892%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165855916616782246461892&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-117633708-null-null.185v2control&utm_term=%E6%81%B6%E6%84%8F%E4%BB%A3%E7%A0%81&spm=1018.2226.3001.4450