-
-
[原创]通过Wannacry分析内核shellcode注入dll技术
-
2017-10-11 22:06
8746
-
[原创]通过Wannacry分析内核shellcode注入dll技术
Wannacry爆发过去有半年时间了,但是他的很多技术还是值得研究,确切地说是NSA武器库的技术值得深入研究。今天学习一下内核shellcode注入dll技术。
Wannacry的shellcode分三层,第一层的功能开一个后门,执行攻击者的后续命令;第二层、第三层一起完成注入dll的任务在执行其他操作。
简单介绍第一层功能,挂钩srv模块SrvTransaction2DispatchTable的第14相srv!SrvTransactionNotImplemented,打开一个后门,这部分详细分析可以参考 https://bbs.pediy.com/thread-217734.htm
不过有一点需要指出的是作者在下面一行的猜测
进入shellcode后,该样本在进行奇怪的jne和call之后(我认为是防止静态分析以及弄乱栈),修改了第0C0000082h号MSR:
ffffffff`ffd00201 31c0 xor eax,eax
ffffffff`ffd00203 4090 xchg eax,eax
ffffffff`ffd00205 7408 je ffffffff`ffd0020f
ffffffff`ffd0020f e8a7000000 call ffffffff`ffd002bb
这里31c04090 在x86下反汇编
31c0 xor eax,eax
40 inc eax
90 nop
其中Inc eax 改变zf标志位为0,je语句不执行,接着执行call,而在上面x64的环境下,je语句则要执行,跳转到不同的代码地址。这个小技巧可以动态的判断OS架构执行不同的代码。
第二层和第三层shellcode是在一块儿的,确切的说,内核并不能直接向应用程序注入dll,但是可以通过usermode下apc执行代码向应用程序去注入dll。今天主要分析一下第二层的内核部分的shellcode代码,以下代码都是在64位系统下分析:
- 查找ntoskrnl.exe基地址
首先找到gs[38]处的_KIDTENTRY64指针,在KIDTENTRY64的偏移4,你能得到中断处理的函数指针,这个地址在ntoskrnl.exe中,我们就找到了ntoskrnl.exe的地址空间,然后去地址空间的页头地址对比PE头MZ。找到则函数返回。
- 需要使用的函数并没有硬编码写到程序里,而是硬编码了这些函数的hash值。所以我们需要首先知道函数编码和hash值得对应关系。Hash计算方法如下,用c++代码注释了一下
根据ntoskrnl.exe基地址,函数hash字符查找导出函数地址,find_func如下
附件有ntoskrnl.exe所有导出函数hash对照表,这样整个程序流程一下子就明朗了
- 查找需要用到ntoskrnl.exe导出函数地址并保存备用。
- 查找目标进程,也是通过hash编码782BF0E7h进程名查找,但奇怪是我没有找到对应进程名,看有人分析说NSA武器库是查找“lsass.exe”,查找方法是使用pid暴力查找,从pid =4开始,每步加4,最大值65536找匹配进程名。具体通过pid调用PsLookupProcessByProcessId得到pEProcess结构指针,再通过pEProcess调用PsGetProcessImageFileName得到进程名。
- APC注入,使用查到导出函数的地址,这一步很容易,注释见截图。第六个参数包含了第三层shellcode和dll代码,可自行dump出研究,第七个参数指定为usermode。
- 最后是把shellcode自身以及它所分配的内存清0
- 内核部分的注入代码主要流程就分析完了,到用户层的shellcode自己实现的一个pe loader而没有使用LoadLibary,这样使得注入更加隐蔽,查询PEB_LDR_DATA的也查不到被注入了dll。有时间再具体分析,有开源类似功能参考https://github.com/fancycode/MemoryModule
时间匆忙,难免有疏漏错误之处,还请大家指正,共同学习进步。附件有原始shellcode和ntoskrnl.exe导出函数hash对照表。
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界