网站怎么做英文版的,浙江中立建设网站,浙江省建设质量协会网站,优秀品牌设计案例简介
漏洞编号#xff1a;cve-2016-7193漏洞类型#xff1a;堆溢出软件名称#xff1a;Office模块名称#xff1a;wwlib历史漏洞#xff1a;较多影响的版本 攻击利用#xff1a;APT 攻击利器-Word 漏洞 CVE-2016-7193 原理揭秘
操作环境
系统#xff1a;Win10 1607软…简介
漏洞编号cve-2016-7193漏洞类型堆溢出软件名称Office模块名称wwlib历史漏洞较多影响的版本 攻击利用APT 攻击利器-Word 漏洞 CVE-2016-7193 原理揭秘
操作环境
系统Win10 1607软件版本Office2016 16.0.4266.1003poccve-2016-7193.rtf工具Process Monitor、windbg、IDA
分析
文件格式分析样本经过博主进行简化经过控制字运行分开运行之后发现 \dfrxst9具有长度字节的 Unicode 字符数组和 *\shpinstRTF 用于绘图对象控制字是触发漏洞的原因之一
原因分析
崩溃点分析
开启堆调试载入文档后引发异常可见 eax 指向了未知地址导致了异常 从 IDA 分析崩溃点可以看出 mov ecx, [eax] 是取出了对象的虚表并且调用了虚表 1C 位置的函数
逆向分析基地址0x66730000
经过逆向分析之后得出 wwlib 在解析包含数字的 dfrxst 控制字时会在 wwlib!PTLS7::FsUpdateFinitePage0x6d181(66a16efc) 地址上调用 sub_66a16c81 函数对数字进行处理。例如 langfe1024 控制字的数字为 1024ASCII 为 0x31 0x30 0x32 0x34在此基础上减去 0x30 得出 1 0 2 4然后经过 ((((1) * a) * a 2) * a 4) 公式计算得出为 0x400暂时称这个值为 “dfrxst 控制字后数字运算值” 在 wwlib!PTLS7::FsUpdateFinitePage0x7a9c0(66A2473B) 地址上将 “dfrxst 控制字后数字运算值” 循环写入 v126 v13 0x8FA0 这个地址暂时将这个地址中的数据结构称为 “dfrxst 控制字后数字运算值数组” 在 wwlib!PTLS7::FsUpdateFinitePage0x74113(66a1de8e) 地址中将 v257[0x8FC4] 传入 sub_669e393f 函数v257 变量中的值实际上指向上面的 v126 v13 计算后得出的地址 在 wwlib!PTLS7::FsUpdateFinitePage0x39dc0(669E3B3B) 地址中会将之前 v257[0x8FC4] 往后的数据写入到 TLS(0x1e) 中指定的地址方便后面取出 在 wwlib!PTLS7::FsDestroySubpageBreakRecord0x10920(669477DD) 地址中会取出上面 TLS(0x1e) 的地址 在 wwlib!PTLS7::FsDestroySubpageBreakRecord0xbfdd(66942E9A) 地址上会取出 “dfrxst 控制字后数字运算值数组” 0x24 偏移的数据调试时值为 0x09c00c0c 然后调用 MSO_557 函数取出 0x09c00c0c 0x48 地址的值因为没有堆喷射所以值为 0x00000000最后在调用 mov ecx, [eax] 指令从 0x00000000 地址取值时崩溃
根本原因
由于 wwlib!PTLS7::FsUpdateFinitePage0x7a9c0(66A2473B) 地址上循环调用 swtich case 138 分支将 “dfrxst 控制字后数字运算值” 写入 v126 v13 0x8FA0 地址时并没有控制循环的次数导致只要存在足够多的带数字的控制字就会造成堆中的数据溢出 以下为写入前的 “dfrxst 控制字后数字运算值数组” 结构可以看到 0x24 的地方是一个数据结构值为 0x56f30f90
56bc1450 00000009 00000000 00000000 00000000
56bc1460 00000000 00000000 00000000 00000000
56bc1470 00000001 56f30f90 00000000 00000000
56bc1480 00000000 00000000 00000000 00000000
56bc1490 00000000 00000000 00000000 00000000
56bc14a0 00000000 00000000 00000000 00000000
56bc14b0 00000000 00000000 00000000 00000000
56bc14c0 56f30f90 00000000 00000000 00000001在持续写入之后会造成溢出可以看出 0x56f30f90 变成了 0x09c00c0c。至于为什么 0x20 的地方没有变化因为这是一个 int 变量用于统计写入的字节大小并且在写入之后进行更新
56bc1450 0c0cc009 0c09c00c 0c09c00c 0c09c00d
56bc1460 0bc0090c 15172018 09c00c0c 200c09c0
56bc1470 00000028 09c00c0c 00000000 00000000
56bc1480 00000000 00000000 00000000 00000000
56bc1490 00000000 00000000 00000000 00000000
56bc14a0 00000000 00000000 00000000 00000000
56bc14b0 00000000 00000000 00000000 00000000
56bc14c0 56f30f90 00000000 00000000 00000001构建与利用
构建流程
只要存在足够多的 dfrxst[数字] 控制字就会造成堆中数据溢出
利用姿势
使用堆喷射技术将载荷喷射到 0x09c00c0c 0x48 地址左右就可以进行利用也可以手动修改 0x09c00c0c 地址
缓解
补丁https://learn.microsoft.com/en-us/security-updates/securitybulletins/2016/ms16-121
参考
https://paper.seebug.org/288/https://bbs.kanxue.com/thread-221792.htm