CVE-2021-1647
前言
这个漏洞是微软在一月份修复的一个Windows Defender RCE, 根据描述来看是Windows Defender在扫描文件的时候导致的漏洞利用, 配合各种自动下载 ( 比如微信 ) 伤害应该很大, 据说已经出现在野利用, 网上有人发了漏洞的poc, 不其实已经算exp了, 只不过执行的是cmd, 简单看了一波poc, 没找到什么平时玩别人exp看到的shellcode之类的, 所以借着这个漏洞研究一波, 顺带学习一下windbg, 做个踩坑记录.
patch
根据腾讯的分析文章来看, 漏洞出现在mpengine.dll
的CAsprotectDLLAndVersion::RetrieveVersionInfoAndCreateObjects
函数
即这里malloc的堆内存不够大导致后续的循环中出现了越界写
而新版本的mpengine.dll
中对参数进行了检查, 咱也看不懂就贴一张腾讯的图吧
windbg笔记
按照知乎的一篇文章配置了一下串口调试Windows内核
windbg连接上被调试的虚拟机后, 按如下过程操作:
!process 0 0 MsMpEng.exe
获取目标进程EPROCESS信息, 至于这个exe是我在放入exp导致Windows defender服务崩溃的时候, 发现会导致这个进程崩溃, 所以猜测应该是这个进程.process /p EPROCESS
切换到目标进程空间.reload /f /user
重新加载用户态符号, 从微软的服务器下载, 这一步需要在环境变量中设置_NT_SYMBOL_PROXY = 127.0.0.1:8080
后面懂的都懂.process /i /p EPROCESS
侵入式调试bp mpengine!CAsprotectDLLAndVersion::RetrieveVersionInfoAndCreateObjects
下断点
断下来以后, 可以看到函数入口地址00007ffd cebd0778
在ida中看到入口地址是0x75A290778
, malloc的地址是0x75A290A57
, 相对偏移0x2df
所以在windbg里的地址是00007ffd cebd0a57
shellcode修改
根据dalao的分析文来看, poc里的0x40a210
函数中, 把shellcode复制进了目标内存后执行的, 所以我们的目标是如何把cmd的shellcode改成我们自己的
qmemcpy(v7, (const void *)a1, sizeof(v7)); |
可以看到是用memcpy复制的shellcode, shellcode是在栈里保存的参数(32位), 且大小分别为80, 716, 80
Reference
- 腾讯的分析文章: https://mp.weixin.qq.com/s/NNlE39JJZC2zQTlkMS5hNg
- windbg基本操作: https://blog.csdn.net/sxr__nc/article/details/107287513
- windbg打断点: https://www.cnblogs.com/vcerror/p/4289116.html
- 双机调试配置流程: https://zhuanlan.zhihu.com/p/114538001
- 符号下载流程: https://blog.csdn.net/counsellor/article/details/104721338
- dalao的分析: https://blog.csdn.net/AhRMo_WK/article/details/114068727
- https://mp.weixin.qq.com/s/CjsntvNM6_zMZF1IGirMPg