漏洞名称:Microsoft Windows图形渲染引擎WMF格式解码内存越界漏洞
发现者:cocoruder(frankruder_at_hotmail.com) http://ruder.cdut.net
类型:设计错误
最后更新时间:07/01/2006
受威胁的系统:
Microsoft Windows XP SP2
Microsoft Windows XP SP1
Microsoft Windows Server 2003 SP1
Microsoft Windows Server 2003
Microsoft Windows ME
Microsoft Windows 98se
Microsoft Windows 98
Microsoft Windows 2000SP4
未受威胁的系统:
目前未知
厂商:
www.microsoft.com
漏洞描述:
Microsoft Windows的WMF图形渲染引擎处理特殊格式的wmf文件时缺乏参数检查,存在多个内存越界漏洞,如果用户访问了恶意的WMF格式文件将导致拒绝服务攻击。
注意此文章中涉及的问题与ms06-001以及ms05-053中描述的无关。事实上,这是我在测试ms06-001时偶然发现的。
技术细节:
当前发现至少有2个地方可以触发内存越界错误。
1.ExtCreateRegion调用导致内存越界。
函数原型:
HRGN ExtCreateRegion(
CONST XFORM *lpXform, // transformation data
DWORD nCount, // size of region data
CONST RGNDATA *lpRgnData // region data buffer
);
PlayMetaFileRecord函数在调用此函数前会组织RGNDATA *lpRgnData参数,涉及下面几个结构
WMFRECORD结构:
typedef struct _StandardMetaRecord
{
DWORD Size; /* Total size of the record in WORDs */
WORD Function; /* Function number (defined in WINDOWS.H) */
WORD Parameters[]; /* Parameter values passed to function */
} WMFRECORD;
ExtCreateRegion调用对应的Parameters结构:
typedef struct _Parameters
{
char unknow1[0x0a];
WORD All_PointtStruct_Num; //后面PointtStruct块的总数
char unknow2[0x0a];
char PointtStruct[]; //首块
}Parameters;
一个PointtStruct块的结构:
typedef struct _PointtStruct
{
WORD PointNum; //后面的RECT结构成员的数目(1个成员2字节)
WORD Point[PointNum]; //4个Point构成1个RECT
char unkonow[6];
}PointtStruct;
因此每个PointtStruct块的总字节数=PointNum*2+8
ExtCreateRegion调用码为0xff,下面的代码完成计算并分配堆内存操作。
.text:7F00FE07 loc_7F00FE07: ; CODE XREF: PlayMetaFileRecord+1256j
.text:7F00FE07 sub eax, 3
.text:7F00FE0A jnz loc_7F022B9A ; 0xff
.text:7F00FE10 movzx ecx, word ptr [ebx+10h] ;取得PointtStruct块总数
.text:7F00FE14 mov [ebp-88h], ecx &nbs
发现者:cocoruder(frankruder_at_hotmail.com) http://ruder.cdut.net
类型:设计错误
最后更新时间:07/01/2006
受威胁的系统:
Microsoft Windows XP SP2
Microsoft Windows XP SP1
Microsoft Windows Server 2003 SP1
Microsoft Windows Server 2003
Microsoft Windows ME
Microsoft Windows 98se
Microsoft Windows 98
Microsoft Windows 2000SP4
未受威胁的系统:
目前未知
厂商:
www.microsoft.com
漏洞描述:
Microsoft Windows的WMF图形渲染引擎处理特殊格式的wmf文件时缺乏参数检查,存在多个内存越界漏洞,如果用户访问了恶意的WMF格式文件将导致拒绝服务攻击。
注意此文章中涉及的问题与ms06-001以及ms05-053中描述的无关。事实上,这是我在测试ms06-001时偶然发现的。
技术细节:
当前发现至少有2个地方可以触发内存越界错误。
1.ExtCreateRegion调用导致内存越界。
函数原型:
HRGN ExtCreateRegion(
CONST XFORM *lpXform, // transformation data
DWORD nCount, // size of region data
CONST RGNDATA *lpRgnData // region data buffer
);
PlayMetaFileRecord函数在调用此函数前会组织RGNDATA *lpRgnData参数,涉及下面几个结构
WMFRECORD结构:
typedef struct _StandardMetaRecord
{
DWORD Size; /* Total size of the record in WORDs */
WORD Function; /* Function number (defined in WINDOWS.H) */
WORD Parameters[]; /* Parameter values passed to function */
} WMFRECORD;
ExtCreateRegion调用对应的Parameters结构:
typedef struct _Parameters
{
char unknow1[0x0a];
WORD All_PointtStruct_Num; //后面PointtStruct块的总数
char unknow2[0x0a];
char PointtStruct[]; //首块
}Parameters;
一个PointtStruct块的结构:
typedef struct _PointtStruct
{
WORD PointNum; //后面的RECT结构成员的数目(1个成员2字节)
WORD Point[PointNum]; //4个Point构成1个RECT
char unkonow[6];
}PointtStruct;
因此每个PointtStruct块的总字节数=PointNum*2+8
ExtCreateRegion调用码为0xff,下面的代码完成计算并分配堆内存操作。
.text:7F00FE07 loc_7F00FE07: ; CODE XREF: PlayMetaFileRecord+1256j
.text:7F00FE07 sub eax, 3
.text:7F00FE0A jnz loc_7F022B9A ; 0xff
.text:7F00FE10 movzx ecx, word ptr [ebx+10h] ;取得PointtStruct块总数
.text:7F00FE14 mov [ebp-88h], ecx &nbs