葡京赌场官方网站_澳门葡京网站_澳门新葡萄京www27111com
欢迎来到兴华永恒!加入收藏设为首页
您当前所在位置:首页 > 手艺专栏 > 专业公布
手艺专栏

针对CVE-2015-2545破绽研讨阐发(上篇)



1. 概述

这是一种MSOffice破绽,许可经由过程利用特别的 Encapsulated PostScript (EPS)图形文件随便施行代码。这类破绽于2015年3月被发明,破绽未修补状况连续了4个月。以后,微软公布了修复补钉(MS15-099),处理了这一安全问题。

破绽公布工夫:2015-09-08    
破绽更新工夫:2015-09-08
影响体系

Microsoft Office 2007 SP3
Microsoft Office 2010 SP2
Microsoft Office 2013 SP1
Microsoft Office 2013 RT SP1澳门葡京网站
Microsoft Office for Mac 2011
Microsoft Office for Mac 2016
Microsoft Office Compatibility Pack SP3

破绽信息
Microsoft Office是一款微软公布的办公处置使用套件。
Microsoft Office处置EPS文件存在内存毁坏,许可攻击者构建歹意文件,诱使使用剖析,可使应用程序瓦解或施行随便代码。
用户可参考以下厂商供给的安全补丁以修复该破绽:

2. 样本滥觞

经由过程`推特`搜索`cve-2015-2545`获得相干信息,挑选信息获得其哈希值`哈希值:375e51a989525cfec8296faaffdefa35`,以后Google搜索其哈希值,最初在`

3. 阐发

3.1 破绽成因以及操纵

当EPS在处置`字典范例(dict)`的`copy操纵`时,将会承受拷贝方的`键值对`,而且将本身空间数据局部删除,然后再从头分派一个空间停止数据拷贝(一般状况下字典拷贝时只对要拷贝的元素停止操纵,而不影响其它元素)。而EPS在处置`forall操纵`时,当处置范例为`字典(dict)`时,`forall`逐一处置字典(dict)中的每一个`键值对`,`forall`会得到`当前键值对`的`内容`以及一个`ptrNext指针`,并指向下一个要处置的键值对,并将键(key)和值(value)的内容放到`操纵栈`中,然后停止`forall的处置历程(proc)`,处置完后`仍保存ptrNext指针`以此来处置下一个键值对。假如在`forall`处置历程中有字典的`拷贝(copy)`操纵,copy操纵会将`键值对`条目`局部删除`,而forall的ptrNext指针仍`存在`,这时候`ptrNext`就变成一个`野指针`,只要经心机关指针指向的数据,就能够到达操纵结果。该样本操纵方法为经由过程该野指针终极机关出一个肇端地址为0x0,巨细为0x7fffffff的`string工具`,如许就能够在该空间内作`随便`的`读写`操纵以及前期的`ROP,Shellcode`的操纵操纵。

3.2 测试情况

1. Microsoft Windows [版本 6.1.7601] 旗舰版sp1 简体中文 x86
2. Windows Debugger Version 6.12.0002.633 X86
3. IDA6.8.150423 (32-bit)葡京赌场官方网站
4. OllyDbg 1.0
5. Notepad++
6. Microsoft Office Word 2007(12.0.6612.1000) SP3 MSO(12.0.6607.10000)

3.3 调试标的目的

此样本从3个方面来停止调试阐发,第一个调试标的目的:定位最简朴能够获得信息的位置`ROP`,第二个标的目的则为重点标的目的:发生`野指针的位置`,第三个标的目的:`Rop`+`Shellocde`,共3个标的目的停止调试阐发。

3.4 调试阐发-CreateFile动手[第一个标的目的]

1.经由过程Windbg翻开样本,间接运转,能够发明样本在暂时目次文件夹下停止创立文件操纵,创立文件次第:plugin.dll > igfxe.exe,以后,间接想到的是在`ZwCreateFile`下断点【此断点位置不太好,由于word在翻开的时分不竭的跑CreateFile,但经由过程追溯能够找到本人想要的内容】。

1491891625736921.png

图1

2.回溯找到`ROP`,`图2`call则为`rop`call,测试方法,本人在响应call下断点,单步跟随便可,关于rop,换栈空间的操纵以及前面的shellcode这里先不具体阐发,本人能够单步跟随便可。

1491891678660295.png

图1

1491891731885110.png

图2

3.5 调试阐发-野指针发生历程[第二个标的目的]

3.5.1 浅易例子注释UAF

此历程比力庞大,需求理解“PostScript”语法,能够下载<<PLRM2.pdf>>来进修;各人还要理解下关于`UAF`的简朴的常识,何为`UAF`?就是字面意义“开释后从头利用“,例子以下:

#include<stdio.h>

    #include<stdlib.h>

    #include<malloc.h>

     

    void *pfunc1()

    {

        printf("testn");

    }

     

    typedef struct Object1_struct{

        int flag;

        void (*pfunc1)();

        char message[4];

    }OBJECT1;

     

    typedef struct Object2_struct{

        int flag;

        int flag2;

        char *welcome;

    }OBJECT2;

     

    int main()

    {

        int i;

        OBJECT1 *pObject1;

        OBJECT2 *pObject2;

        pObject1 = (OBJECT1 *)malloc(sizeof(OBJECT1));//init struct

        pObject1->flag = 1;

        //pObject1->pfunc1();

        //pObject1->message = "this is first create!";

         

        free(pObject1);

        /*forget pObject1 = NULL*/

        for(i=0;i<1000;i++)

        {

            pObject2 = (OBJECT2 *)malloc(sizeof(OBJECT2));//heap spray

            pObject2->flag=2;

            pObject2->flag2=4;

            pObject2->welcome = "AAAA";

        }

        /*fill pointer*/

     

        if(pObject1 != NULL)

            pObject1->pfunc1();

        return 0;

    }

3.5.2 优化PostScript

理解上面的常识以后我们需求定位破绽呈现的位置,我们知道此破绽呈现的位置是在forall操纵内里发作的,这个时候能够看下word文件中镶嵌的iamge1.eps文件,从文件能够看出代码都被挤压成一同了,很不便利寓目这些代码,只能手动对枢纽代码变动`[图2]`所示

1491892229562806.png

图1

1491892260864882.png

图2

3.5.3 定位EPS样本文件枢纽位置

从代码上我们最直观发明的是`<00000000ff030000030000000000000000000000444444440005000000000000000000>`这一串工具,详细是什么我们如今先不需要思索,然后我们能够看到forall操纵{}里好多其他代码,此中就包罗了copy的操纵,这个位置就是招致破绽发生的处所,那我们怎么去定位呢?静态调试,栈回溯的方法这个有点坑,大要你跟一天也跟不到吧,由于内里操纵出格多,要知道这里面每一个操纵都是一个函数,以是回溯的办法不太可取,这个时候就需求用到IDA,间接利用IDA翻开破绽模块,翻开以后我们该当想到,既然是操纵,那么该当跟函数一样有带字符串的名字,那么我们是否是能够经由过程IDA–>shitf+f12【字符串窗口】–>查找forall这个函数呢?我们用`alt+t`查找下,公然,有了我们想要的工具`图1`,我们跟进去,发现有个处所在援用`图2`,我们持续跟进去,间接定位到了`forall函数“图3`,同理可得,我们能够定位到`copy`的函数与其他枢纽函数,然后静态调试跟随便可。

葡京赌场官方网站

图1

2017-03-27_151229.png

图2

2017-03-27_151248.png

图3

3.5.4 枢纽函数断点位置

起首我们在枢纽几个位置下断点,经由过程IDA获得偏移地址,间接Windbg or OD 定位响应位置便可,这里我用的是Windbg下断点,上面列出的断点是我调试了许多次所记载下的断点,大部分的断点我都给下了次要为了了解下代码流程便利寓目,实在刚刚开始调试只需求在forall一处下断点便可,先理解其构造在察看其做法,我们先断第一个`forall`的位置

<`EPSIMP32!RegisterPercentCallback+0x4526`>

     0 e 6822bcc6     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x4664 ".printf "forall_value_key_pNext""     1 e 6823cbe4     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x15582 ".printf "dict1_dict2_Copy""     2 e 6823a4f0     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x12e8e ".printf "dict1_dict2_copy_2""     3 e 6821a0e8     0001 (0001)  0:**** EPSIMP32+0x1a0e8 ".printf "_copy_delete ""     4 e 6823cd89     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x15727 ".printf"copy_memcpy ""     5 e 6823ca58     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x153f6 ".printf"_exch_fun_""     6 e 6823d592     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x15f30 ".printf"_put_fun_""     7 e 6823d73c     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x160da ".printf"_PutInterVal_fun_""     8 e 68230313     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x8cb1 ".printf"_BytesavailabelFun_""     9 e 6823d8f5     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x16293 ".printf"_StringFun_""    10 e 682312e6     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x9c84 ".printf"_ShowFun_""    11 e 6823d830     0001 (0001)  0:**** EPSIMP32!RegisterPercentCallback+0x161ce ".printf"memcpy_putinterval_""    12 e 6820cff5     0001 (0001)  0:**** EPSIMP32+0xcff5 ".printf"memcpy_put_bitshift_and_add_""


3.5.5 关于forall操纵函数

我们经由过程ida能够察看forall是个`条件分支的语句`,经由过程查询《PLRM2.PDF》获得关于forall的注释,约莫有4种状况,不外能够看出“array proc”与“packedarray proc”是一样的范例都是数组范例,其它两品种型分别是字典范例与字符串范例,考证方法间接在image.eps文件中增加尝试代码便可考证。

2017-03-27_155149.png

图1

1491893017468516.png

图2



澳门葡京赌场官网
在线征询 周一至周五
09:00-18:00
澳门葡京赌场官网