首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>漏洞资料>文章内容
Microsoft Windows winhlp32.exe 堆溢出漏洞
来源:www.xfocus.net 作者:flashsky 发布时间:2004-12-23  

[AD_LAB-04006] Microsoft Windows winhlp32.exe 堆溢出漏洞

flashsky (flashsky1_at_sina.com)

通告:[AD_LAB-04006] Microsoft Windows winhlp32.exe 堆溢出漏洞
Class: 设计错误
DATE:12/20/2004
CVE编号:CAN-2004-1306

受威胁的系统:
Windows NT
Windows 2000 SP0
Windows 2000 SP1
Windows 2000 SP2
Windows 2000 SP3
Windows 2000 SP4
Windows XP SP0
Windows XP SP1
Windows XP SP2
Windows 2003
未受威胁的系统:
目前未知
厂商:
www.microsoft.com


1.漏洞描述:
Microsoft Windows winhlp32.exe在解析.hlp文件的时候存在着一个堆溢出,这个漏洞是通过对windows .hlp文件
头进行解码处理时触发的。

2.技术描述
当hlp文件是以分段来进行压缩的,他包含一个以phrase命名的内部文件,这个phrase文件由一个phrase表头和多个
phrase表组成,phrase的表头处于.hlp文件的偏移0x19处,结构定义如下:
unsigned short wNumberOfPhrases;
unsigned short wOneHundred; 0x0100;
long decompressedsize;

phrases表头后面立即跟着phrases表,每个phrases表项占4个字节,2个字段phrasesHeadOffset和phrasesEndOffset,
分别都是即unsigned short类型。代表phrases的头尾的偏移。

处理phrases表的函数具有3个参数(在中文2000 sp4上该函数的地址是0x0100A1EF),其中第3个参数为指向phrases表
头的指针,第2个参数指向一个堆内存,用于保存phrases数据.但是在计算数据长度时并没有判断数据长度是否合法,这就
导致可以构造一个.HLP,可以覆盖由第2个参数所指向的堆内存。以下是对该函数的分析:

0100A1EF sub_100A1EF proc near ; CODE XREF: sub_100A14C+6Fp
.text:0100A1EF
.text:0100A1EF arg_0 = dword ptr 4
.text:0100A1EF arg_4 = dword ptr 8
.text:0100A1EF arg_8 = dword ptr 0Ch
.text:0100A1EF
.text:0100A1EF mov eax, [esp+arg_8] ;arg_8 指向phrase表头
.text:0100A1F3 push ebx
.text:0100A1F4 push esi
.text:0100A1F5 push edi
.text:0100A1F6 movzx edx, word ptr [eax+2] ;[eax+2] -> wOneHundred
.text:0100A1FA mov ecx, [eax+0Ch] ;[eax+0Ch] -> phrase 表
.text:0100A1FD mov eax, [esp+0Ch+arg_0] ;以下计算 phrase表的偏移
.text:0100A201 sub eax, edx
.text:0100A203 mov ebx, [esp+0Ch+arg_4]
.text:0100A207 mov edi, eax
.text:0100A209 shr eax, 1
.text:0100A20B and edi, 1
.text:0100A20E movzx edx, word ptr [ecx+eax*2] ;phrase_offset1
.text:0100A212 movzx esi, word ptr [ecx+eax*2+2] ;phrase_offset2
.text:0100A217 sub esi, edx
.text:0100A219 add ecx, edx
.text:0100A21B push esi ; size_t ;size = phrase_offset2 - phrase_offset1
.text:0100A21C push ecx ; void *
.text:0100A21D push ebx ; void * ;ebx -> 第二个参数,即堆内存
.text:0100A21E call ds:memmove

在这里,存在着2个导致溢出的问题,
1.整数溢出,如果phrasesEndOffset比phrasesHeadOffset小,phrasesEndOffset-phrasesHeadOffset为一个负数,这里并没有做检查,
实际调用memmove的时候,触发了溢出。
2.另外,在堆分配的时候,并非是根据phrasesEndOffset-phrasesHeadOffset计算时候进行分配的,而是根据hlp文件里的另外字段进行
解码计算和分配的,由于解码和计算过程过于复杂,这里不在详细描述,只要修改一个正常的hlp文件的某个phrases表项,增大phrasesEndOffset
字段也将触发这一漏洞。

可以通过访问 http://www.xfocus.net/flashsky/icoExp/index.html 来验证此漏洞


3.感谢
Keji(yu_keji@venustech.com.cn) 发现并公布了此漏洞,具体的技术分析由keji,flashsky,icbm完成
感谢启明星辰技术信息有限公司积极防御实验室的伙伴和丰收项目小组。

4.申明:

The information in this bulletin is provided "AS IS" without warranty of any
kind. In no event shall we be liable for any damages whatsoever including direct,
indirect, incidental, consequential, loss of business profits or special damages.

Copyright 1996-2004 VENUSTECH. All Rights Reserved. Terms of use.

VENUSTECH Security Lab
VENUSTECH INFORMATION TECHNOLOGY CO.,LTD(http://www.venustech.com.cn)

Security
Trusted {Solution} Provider
Service



 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·XSOK环境变量本地命令执行漏洞
·N点虚拟主机管理系统 致命漏洞。
·南方数据企业网站管理系统V10.0
·动网(DVBBS)Version 8.2.0 后
·Solaris 10 telnet漏洞及解决
·破解无线路由器密码,常见无线密
·Nginx %00空字节执行php漏洞
·WinWebMail、7I24提权漏洞
·XPCD xpcd-svga本地缓冲区溢出漏
·Struts2多个漏洞简要分析
·ecshop2.72 api.php 文件鸡肋注
·Discuz!后台拿Webshell 0day
  相关文章
·Microsoft Windows LoadImage AP
·Microsoft WINDOWS ani 光标文件
·多个浏览器嵌套数组sort()循环栈
·Linux 2.6.* 内核Capability LSM
·Jabberd2.x 服务器多个远程缓冲
·最新公布的动易4.03上传漏洞
·小榕的WIS漏洞补充篇及利用篇
·phpBB远程任意SQL注入漏洞
·微软最新安全漏洞大揭秘
·JAF CMS多个安全漏洞
·最近发现的一个Distributed File
·Merak Mail Server远程验证用户
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved