-
-
[原创]CVE-2012-1876漏洞分析
-
发表于: 2018-8-23 20:54 4431
-
table标签中col元素的span值被重新设置时未正确检查需要分配的缓冲区大小,并向堆中进行写入操作,若用户访问攻击者精心构造的页面,可能导致任意代码执行。
先用gflag给IE加上hpa,然后运行IE,用Windbg附加,开启子进程调试(.childdbg 1),打开POC, +42F167处崩溃,如下图所示:
可看到edi被污染,反汇编看下该函数,edi由esi赋值,而esi又由上层函数CalculateMinMax传递过来。
重新附加IE,,通过sxe ld:mshtml命令让子进程在加载mshtml模块时断下,然后再通过命令bp mshtml!CTableLayout::CalculateMinMax对漏洞函数下断。
断下来后进行跟踪分析,可看到该函数的第一个参数为CTableLayout对象。
继续跟踪,代码取出了col元素中的span值,我们这里称之为spannum,在后面的指令经常会用到。
后面的指令非常多,单步跟踪太耗时,这里结合IDA进行分析,导入windbg下载的pdb文件后,找到CalculateMinMax函数。跳过部分指令,找到负责分配内存的函数,在分配前会取出一个值(为0)用于和spannum比较,我们称之为spancmp。
跟进该函数,计算分配内存大小时为spannum*0x1C,至少为4*0x1C,分配后的内存地址位于CTableLayout+0x9C(ebx+0x9C)。
分配完内存后,运行,允许加载控件,再次在CalculateMinMax断下,再运行,断下来后才执行poc中的over_trigger函数,而《漏洞战争》一书中第二次运行就执行over_trigger函数,猜测是本地允许加载控件后重新解析poc的原因。
第二次断在CalculateMinMax后,spannum不变,spancmp为4,所以不再分配内存。
在mshtml!CTableCol::GetAAspan下断点,使其在第二次获取span值时断下,然后用gu命令执行到返回后断下,获取的值为0x3e8(1000)。
继续执行,会计算width*100的结果0x414114作为循环复制的内容。
然后将取出的span值0x3e8作为复制操作的计数器,书上写的计数器则为0x3e8*1C,通过调试分析,0x3e8*1C为拷贝的最大偏移地址,一开始还没拷贝时偏移为0*1C,每次拷贝后偏移地址加0x1C,所以计数器为0x3e8,复制大小为0x3e8*0x1C。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)