MS08-052 WMF漏洞分析及漏洞测试

 
 
一 背景知识

由文件格式入手,来分析MS08-052漏洞, 并构造了一个可以使没有补丁的程序崩溃的图片,

1 WMF文件结构

--------------------------|

|         文件头            |

|-------------------------|

|       文件记录          |

|-------------------------|

|-------------------------|

|       文件记录          |

|-------------------------|

|-------------------------|

|       文件记录         |

|-------------------------|

windows中文件头结构如下

typedef struct
{
    INT16           Left;
    INT16           Top;
    INT16           Right;
    INT16           Bottom;
} PWMFRect16;

typedef struct
{
    UINT32          Key;            // GDIP_WMF_PLACEABLEKEY
    INT16           Hmf;            // Metafile HANDLE number (always 0)
    PWMFRect16      BoundingBox;    // Coordinates in metafile units
    INT16           Inch;           // Number of metafile units per inch
    UINT32          Reserved;       // Reserved (always 0)
    INT16           Checksum;       // Checksum value for previous 10 WORDs
} WmfPlaceableFileHeader;

typedef struct tagMETAHEADER
{
    WORD        mtType;                  // 01 磁盘
    WORD        mtHeaderSize;            // 0x0009 头大小9个word
    WORD        mtVersion;
    DWORD       mtSize;                  // 不算WmfPlaceableFileHeader头的文件大小
    WORD        mtNoObjects;
    DWORD       mtMaxRecord;
    WORD        mtNoParameters;
} METAHEADER;

                                             图 1.1 文件头

文件记录由 文件记录大小(4字节) 文件记录类型(2字节) 文件记录体组成,其中0x0538类型是polypolygon类型,正是对这个记录的处理不当导致的溢出, 该记录的结构如下

记录大小 

记录类型

polygon个数(假设为x)    

第1个polygon的点数(y个)     第2个polygon点数 ....第x个polygon的点数   .

第1个polygon的第1个点    第1个polygon的第2个点....第1个polygon的第y个点

...............

第x个polygon的第1个点 .................................第x个polygon的最后1个点

由图1.2看出该记录的大小为0x73个word长度.   该记录类型是0x0538 该记录中polygon的个数为1 , polygon的点数为0x37, 后面0x37个word长度的数据就是该polygon的点. 想要读取该记录则要先分配空间,但并不是根据0x73来分配的,而是根据polygon的个数,及每个polygon的点数相加来分配空间.

                                                           图 1.2 polypolygon记录


二 漏洞部分代码

                                                 图2.1 具有漏洞的代码

                                                   图2.2 微软修补后的代码

除了判断是否小于0 还有判断是否加过了溢出了


三 WMF文件构造

构造了一个wmf文件polypoygon记录, 用极大的polygon个数和每个polygon的点数都很大, 使其计算达到整数溢出,使用没有补丁的gdiplus的程序查看该文件,就可以直接崩溃, , 测试图片连接 http://bbs.antiy.cn/viewthread.php?tid=1087&extra=page%3D1&frombbs=1            无木马. 呵呵
          无木马. 呵呵



四解决方案

有漏洞的赶快打补丁吧

五 总结

图形文件格式是由很多 构成的数据流,而每个段由 :长度, 类型 ,参数,数据等结构构成,在程序解析这些文件格式的时候会依据 “类型 来确认段,并读取参数 进行一定的运算,再依据这些参数来处理随后紧跟的 数据 。漏洞的产生原因就是在对参数进行运算的时候相信了文件输入的参数没有进行确认而导致的。除了图形文件格式外 excelbiff 格式也是一样的由段的头决定后续数据的读取,且有可变数据对象。有输入就有危险.


六 参考文献

[1] GDI+ 中的漏洞可能允许远程执行代码 ( http://www.microsoft.com/china/technet/security/bulletin/MS08-052.mspx

[2] Microsoft GDI+ WMF PolyPolygon Record Parsing Integer Overflow http://secunia.com/binary_analysis/sample_analysis/ 2008

[3] Wmf http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/WindowsMetafileFormat(wmf)Specification.pdf 2008

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值