-
-
漏洞分析CVE-2023-21716
-
发表于: 2023-3-14 17:16 9382
-
背景
Microsoft Word 是 Microsoft Office 附带的文字处理应用程序。根据默认安装,Microsoft Word 处理多信息文本格式 (RTF) 文档。此类文档主要由基于 7 位 ASCII 的关键字组成,这些关键字一起可以封装各种丰富的内容。CVE-2023-21716 是Microsoft Word在处理RTF字体表时引起的堆溢出漏洞,近期网络上出现了多个poc样本,参考网络上的信息进行复现分析学习了一下漏洞原理。
复现环境
OS 版本: 10.0.19044 暂缺 Build 19044
Office:2016
wwlib.dll:16.0.4266.1001
漏洞复现与分析
参考分析文章发现漏洞发生在wwlib.dll文件的FSearchFtcmap函数中,在office2019中可以获取到wwlib.dll的pdb调试符号文件,但调试时没有复现成功。随后参考360的分析文章下载了office2016,可以调试复现成功。
首先选用Xnuvers007的poc脚本:open("exploit.rtf", "wb").write(("{\rtf1{\n{\fonttbl" + "".join([ ("{\f%dA;}\n" % i) for i in range(0,32761) ]) + "}\n{\rt''lch no crash??}\n}}\n").encode('utf-8')) 生成rtf文件样本。
为了能准确定位到漏洞触发位置,先要开启页堆PageHeap,
启动word程序,再使用x64dbg附加进程,让进程完全运行起来后,打开生成的rtf样本文件,在样本文件加载过程中,调试器会暂停在触发漏洞的代码位置并打印相应日志记录。
在日志中可以看到由于漏洞触发导致的访问异常
结合分析文章和调试,可以得知在触发漏洞前几行代码中,rcx是poc样本中的字体库索引0-0x7FF8,而rdx是rcx+0xA后的值,即0xA-0x8002。
在漏洞触发点前设置断点,可以打印日志跟踪rcx,rdx以及rbx+rdx*2+4的值,从而分析漏洞发生的原因。
在rva为0x38F5F1和0x38F5F8处设置断点。
在0x38F5F1处进行断点设置,打印rcx和rdx寄存器值。
在0x38F5F8处设置断点,打印rbx+rdx*2+4的值。
重新调试运行word程序,打开poc样本文件,就可以从日志中看到rdx在rcx==0x7FF8时,本应取值0x8002,但由于movsx指令的符号扩展,将最高位扩展为1,导致rdx取值为0xFFFFFFFFFFFF8002。在后续运算中rbx+r8*2+4的值超出了正常范围,从而引起了越界写操作。
参考
https://github.com/Xnuvers007/CVE-2023-21716
https://github.com/gyaansastra/CVE-2023-21716
https://qoop.org/publications/cve-2023-21716-rtf-fonttbl.md
https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/gflags-and-pageheap
https://help.x64dbg.com/en/latest/introduction/Formatting.html
http://www.c-jump.com/CIS77/ASM/DataTypes/T77_0270_sext_example_movsx.htm
https://mp.weixin.qq.com/s/TMcMuiiRLGWU2yHzlosa4Q
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创][原创]KCTF2023 第二题wp 9028
- [原创]KCTF2023 第一题wp 2827
- 漏洞分析CVE-2023-21716 9383
- [原创]lrzsz工具小记 7880