首页
论坛
课程
招聘
[原创]通过Wannacry分析内核shellcode注入dll技术
2017-10-11 22:06 6105

[原创]通过Wannacry分析内核shellcode注入dll技术

2017-10-11 22:06
6105
 

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位系统下分析:

  1. 查找ntoskrnl.exe基地址

    首先找到gs[38]处的_KIDTENTRY64指针,在KIDTENTRY64的偏移4,你能得到中断处理的函数指针,这个地址在ntoskrnl.exe中,我们就找到了ntoskrnl.exe的地址空间,然后去地址空间的页头地址对比PE头MZ。找到则函数返回。
  2. 需要使用的函数并没有硬编码写到程序里,而是硬编码了这些函数的hash值。所以我们需要首先知道函数编码和hash值得对应关系。Hash计算方法如下,用c++代码注释了一下

    根据ntoskrnl.exe基地址,函数hash字符查找导出函数地址,find_func如下

    附件有ntoskrnl.exe所有导出函数hash对照表,这样整个程序流程一下子就明朗了
  3. 查找需要用到ntoskrnl.exe导出函数地址并保存备用。
  4. 查找目标进程,也是通过hash编码782BF0E7h进程名查找,但奇怪是我没有找到对应进程名,看有人分析说NSA武器库是查找“lsass.exe”,查找方法是使用pid暴力查找,从pid =4开始,每步加4,最大值65536找匹配进程名。具体通过pid调用PsLookupProcessByProcessId得到pEProcess结构指针,再通过pEProcess调用PsGetProcessImageFileName得到进程名。
  5. APC注入,使用查到导出函数的地址,这一步很容易,注释见截图。第六个参数包含了第三层shellcode和dll代码,可自行dump出研究,第七个参数指定为usermode。
  6. 最后是把shellcode自身以及它所分配的内存清0
  7. 内核部分的注入代码主要流程就分析完了,到用户层的shellcode自己实现的一个pe loader而没有使用LoadLibary,这样使得注入更加隐蔽,查询PEB_LDR_DATA的也查不到被注入了dll。有时间再具体分析,有开源类似功能参考https://github.com/fancycode/MemoryModule

时间匆忙,难免有疏漏错误之处,还请大家指正,共同学习进步。附件有原始shellcode和ntoskrnl.exe导出函数hash对照表。


[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (8)
雪    币: 15654
活跃值: 活跃值 (16534)
能力值: (RANK:75 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2017-10-11 22:27
2
0
感谢分享!
雪    币: 689
活跃值: 活跃值 (146)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
落笔飞花 活跃值 1 2017-10-14 14:45
3
0
前排
雪    币: 1405
活跃值: 活跃值 (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
邪梦 活跃值 2017-10-14 20:33
4
0
谢谢分享,
雪    币: 88
活跃值: 活跃值 (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Akkuman 活跃值 2017-10-17 22:57
5
0
感谢楼主分享
雪    币: 610
活跃值: 活跃值 (228)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ugvjewxf 活跃值 2017-10-23 09:29
6
0
好东西,学习
雪    币: 562
活跃值: 活跃值 (879)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
库尔 活跃值 2017-10-23 09:52
7
0
喜闻乐见APC大法=-=
雪    币: 3
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_Defeat. 活跃值 2018-4-27 14:00
8
0
楼主  小弟最近也在研究这个shellcode,但是发现抓的包转成汇编码后  跟lz的有一部分一样也有很多东方不一样啊  搞不懂啊  头疼  这是学校做的课题  求助
雪    币: 3
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_Defeat. 活跃值 2018-4-27 14:07
9
0
楼主 麻烦你看一下这是我抓包处理后的数据 里面有我的注释  因为ida每次翻译成汇编都不对所以才用txt 我是萌新 请见谅
上传的附件:
游客
登录 | 注册 方可回帖
返回