漏洞简介
Hancom 公司为韩国的政府所支持的软件公司。目前主要的是两个产品系列,一个是Hancom Office,另一个是ThinkFree Office。Hancom Office套件里主要包含HanCell(类似微软的Excel),HanShow (类似微软的PowerPoint),HanWord(也就是HWP,类似微软的Office Word)等。
Hancom Office办公套件在韩国是非常流行的办公处理软件,有超过75%以上的市场占有率。当Hancom Office在处理畸形的hwp文件格式时,发生空指针引用,从而造成程序崩溃。
官网:https://www.hancom.com/index.jsp
利用windbg脚本进行污点分析
在实际的漏洞挖掘中,当我们分析一个程序如何处理一个特殊的文件类型时,往往需要大量的时间人工分析、基于经验的合理推理,才能得出,程序第一次打开该文件是什么时候,是什么时候读写和解析该文件的,又是哪块模块进行处理的。
有人说,对于文件的解析分析,只需要在 CreateFileW/A、ReadFile 等相应关键函数下断点即可;但是当在windbg调试器里下CreateFileW时,问题就会出现,该程序调用CreateFileW的地方太多,比如:程序加载dll的时候,会调用CreateFileW,程序初始化配置时加载的配置文件,也会调用CreateFileW。所以在分析的时候,很难拿到一手的资料。
我的解决思路是,通过编写windbg 脚本自动化分析并列出我想要的内容,类似于”白眉”工具。但由于写了1000多行的wds脚本,代码很乱,而且在通过实验去验证自己的想法的时候,也遇到了大量的麻烦;用原生的windgb语法或者借用pykd,写的python脚本都没有达到预期;python写的脚本,不能达到自动化分析;通过原生的windgb语法可以达到比较流畅的自动化,但是仍然很卡,目前具体原因未知,在换了几个系统和windbg版本后,能够完成基本的功能。
下面是我从代码里提取出来的一部分内容:
$$ $><C:\Users\admin\Desktop\a\CreateFileW_script.wds bp CreateFileW " r $t0=poi(esp+4) as /mu ${/v:$FileName} $t0 .echo .printf \"[*] Currently open file:%mu\",$t0 .echo .block { .if($spat(@\"${$FileName}\",@\"*test.hwp\")) { .printf \"[+] ok...find file:%mu\",$t0 .echo kb ad ${/v:$FileName} gu !handle eax f } .else { .printf \"[-] no...find file:%mu\",$t0 .echo ad ${/v:$FileName} g } }
通过上图可以知道第一次打开test.hwp文件的函数调用流程,这样我们就可以点对点分析,然后结合winAFL或oss-fuzz,快速写出dome.fuzz程序,来模糊测试特定模块。
HwpViewer-->HwpVApp!CHncAppShield-->kernel32!CreateFileW
当然,在漏洞利用的时候,windbg脚本也是相当给力的,可以可视化观察hwp文件格式里的那段特殊字符,在这就不展开详述了。
漏洞分析
通过windbg打开crash.hwp文件,发现漏洞发生在insp32ml.dll模块,而该模块确实是由俄罗斯写的(模块链接:http://www.informatic.ru/eng),并不是Hancom公司自己的。
可以发现在自己写的strlen函数里,v1是我们可控的字符串参数,在取v1里的内容时,没有进行字符串结束符的过滤检查,造成循环在v1里取值,最后读到未分配的内存地址,从而发生异常。
影响版本
HOffice_2020_TRIAL.exe 11.0.1.1
HOffice_2018_Viewer.exe
HOffice2014VP_Viewer.exe
来源:freebuf.com 2020-09-24 19:54:42 by: 极光无限SZ
请登录后发表评论
注册