精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SMBv3遠(yuǎn)程拒絕服務(wù)(BSOD)漏洞分析

安全 漏洞
這個(gè)SMBv3漏洞是由lgandx爆出的一個(gè)未被微軟修復(fù)的漏洞(暫未發(fā)布補(bǔ)丁),漏洞出來(lái)后我進(jìn)行了一定的分析。

[[183427]]

前言

這個(gè)SMBv3漏洞是由lgandx爆出的一個(gè)未被微軟修復(fù)的漏洞(暫未發(fā)布補(bǔ)丁),漏洞出來(lái)后我進(jìn)行了一定的分析,花了很多時(shí)間,這個(gè)漏洞有一些意思,但是對(duì)于SMB的整個(gè)協(xié)議通信過程非常龐大,所以沒有進(jìn)行非常細(xì)致的跟蹤,包括一些不透明的結(jié)構(gòu)體讓我感到暈頭轉(zhuǎn)向,但到最后還是有了一些結(jié)果。

這個(gè)SMB漏洞可以看作是被動(dòng)的,需要用戶主動(dòng)去訪問445端口才可以觸發(fā),而不像ms08067一樣主動(dòng)攻擊別人,所以需要運(yùn)行漏洞腳本在操作系統(tǒng)上。

那么很多人看到PoC中的關(guān)鍵部分,就會(huì)想:有填充數(shù)據(jù),會(huì)不會(huì)是緩沖區(qū)溢出!

  1. ## Tree Connect 
  2. if data[16:18] == "\x03\x00": 
  3. head = SMBv2Header(Cmd="\x03\x00"MessageId=GrabMessageID(data), PID="\xff\xfe\x00\x00"TID="\x01\x00\x00\x00"CreditCharge=GrabCreditCharged(data), Credits=GrabCreditRequested(data), NTStatus="\x00\x00\x00\x00"SessionID=GrabSessionID(data)) 
  4. t = SMB2TreeData(Data="C"*1500)#//BUG 
  5. packet1 = str(head)+str(t) 
  6. buffer1 = longueur(packet1)+packet1 
  7. print "[*]Triggering Bug; Tree Connect SMBv2 packet sent." 
  8. self.request.send(buffer1) 
  9. data = self.request.recv(1024) 

答案是否定的,至少在我看來(lái),大量的數(shù)據(jù)目的并非是為了填充緩沖區(qū),而是為了繞過tcpip.sys的某處判斷,從而進(jìn)入漏洞出發(fā)的函數(shù)調(diào)用邏輯。

問題出現(xiàn)在smbv2后的一個(gè)特性Tree Connect,用來(lái)處理共享服務(wù)的特性,opcode:0x03,而整個(gè)問題,確是多個(gè)地方導(dǎo)致的。下面我們就一起來(lái)進(jìn)入今天的旅程吧!

Github地址:https://github.com/lgandx/PoC/tree/master/SMBv3%20Tree%20Connect

漏洞復(fù)現(xiàn)

首先,網(wǎng)上關(guān)于這個(gè)漏洞的觸發(fā)方法有很多,比較通用的是twitter中某老外提到的Powershell的方法,最為簡(jiǎn)單,首先我們調(diào)試的環(huán)境是:Windows 10 x64 build 1607

http://p1.qhimg.com/t01ee9ad66a22624d87.png

接下來(lái)我們?cè)趉ali2.0里運(yùn)行漏洞腳本。

kali2.0里運(yùn)行漏洞腳本

隨后執(zhí)行"dir \ip\PATH",漏洞觸發(fā),通過windbg雙機(jī)聯(lián)調(diào),此時(shí)捕捉到了BSOD。

BSOD

可以看到提示此時(shí)問題出現(xiàn)在mrxsmb20.sys中,問題函數(shù)是Smb2ValidateNegotiateInfo,來(lái)看一下觸發(fā)位置的代碼。

  1. kd> p 
  2. mrxsmb20!Smb2ValidateNegotiateInfo+0x17: 
  3. fffff803`1869c7d7 66394114        cmp     word ptr [rcx+14h],ax 
  4. kd> r rcx 
  5. rcx=0x00000000`00000000 

此時(shí)rcx的值為0x0,是一處無(wú)效地址,因此這是由于空指針引用導(dǎo)致的BSOD,接下來(lái)繼續(xù)執(zhí)行可以看到Windows 10引發(fā)藍(lán)屏。

Windows 10引發(fā)藍(lán)屏

回溯及數(shù)據(jù)包分析(important!)

我們來(lái)看一下mrxsmb20.sys關(guān)于Tree Connect特性的一些內(nèi)容,代碼邏輯相對(duì)簡(jiǎn)單。

mrxsmb20.sys關(guān)于Tree Connect特性

可以看到執(zhí)行到Smb2ValidateNegotiateInfo函數(shù)有兩條邏輯調(diào)用,一個(gè)是Smb2TreeConnect_CopyData,一個(gè)是Smb2TreeConnect_Receive,這里我就把我回溯的結(jié)果和大家分享一下,首先,通過Smb2TreeConnect_Receive來(lái)接收smb的Tree Connect數(shù)據(jù),這個(gè)是通過opcode來(lái)決定的。

正常情況下不會(huì)進(jìn)入Smb2TreeConnect_CopyData,但一旦由不正常(后面會(huì)提到)數(shù)據(jù)包執(zhí)行,則會(huì)在Receive之后進(jìn)入CopyData函數(shù)的處理邏輯,從而引發(fā)漏洞。

這里數(shù)據(jù)包分析很關(guān)鍵,因?yàn)樵诼┒从|發(fā)過程中,就是由于數(shù)據(jù)包的問題導(dǎo)致的。

來(lái)看一下Smb最關(guān)鍵的這個(gè)數(shù)據(jù)包。

Smb最關(guān)鍵的這個(gè)數(shù)據(jù)包

來(lái)看一下Smb頭部的協(xié)議格式。

http://p8.qhimg.com/t01cf0603104bb924e7.png

在協(xié)議格式中Opcode指示smb類型

在協(xié)議格式中Opcode指示smb類型

注意數(shù)據(jù)包中對(duì)應(yīng)位置,opcode值是0x03,就是tree connect的處理。同時(shí)這里在后面分析中我們要用到,注意Data數(shù)據(jù)之前的長(zhǎng)度。其中包含了NetBIOS Session Service 4字節(jié),和 SMB2 Header + Tree Connect Body 80字節(jié),以及 Data n字節(jié)。這個(gè)非常重要,后續(xù)分析我們會(huì)用到。

漏洞分析

剛開始,我天真的以為是CopyData引發(fā)的某些異常,后來(lái)發(fā)現(xiàn)我錯(cuò)了,其實(shí)這個(gè)漏洞可以看成利用tcpip.sys中的某些邏輯特性,以及mrxsmb20.sys中對(duì)于相關(guān)結(jié)構(gòu)的檢查不夠嚴(yán)格導(dǎo)致的空指針引用BSOD,而整個(gè)漏洞形成,我是利用正常和不正常的對(duì)比才終于發(fā)現(xiàn)。在分析的過程中,大量不透明的結(jié)構(gòu)體引用讓我有點(diǎn)尷尬,期待更熟悉SMB的大牛能夠繼續(xù)豐富分析。

正常的SMB2 Tree Connect包是不會(huì)觸發(fā)異常的。

SMB2 Tree Connect包

首先我們來(lái)看一下正常的邏輯調(diào)用,關(guān)鍵函數(shù)在tcpip.sys中的TcpDeliverDataToClient,這個(gè)函數(shù)負(fù)責(zé)處理接收到的數(shù)據(jù)包,在一個(gè)while(1)循環(huán)中。

  1. char __fastcall TcpDeliverDataToClient(PKSPIN_LOCK SpinLock, KSPIN_LOCK *a2, _QWORD *a3, _QWORD **a4) 
  2.  while ( 1 ) 
  3.   { 
  4.     …… 
  5.     v22 = (unsigned int)vars30; 
  6.     v23 = TcpIndicateData(v7, v6, v5, &v72); 
  7.     v24 = v71
  8.     if ( !(v6[3] + v6[4]) ) 
  9.       break; 
  10.     …… 

在這個(gè)循環(huán)中,剛進(jìn)入循環(huán)位置有一個(gè)if語(yǔ)句,后面我們會(huì)提到,在接收到TreeConnect包之后,不會(huì)進(jìn)入if語(yǔ)句,而是執(zhí)行下面的函數(shù)調(diào)用,在TcpIndicateData函數(shù)內(nèi)部會(huì)調(diào)用到之前提到的Smb2TreeConnect_Receive,注意這一切現(xiàn)在都是在我們發(fā)送一個(gè)正常數(shù)據(jù)包時(shí)完成的。(接下來(lái)我們會(huì)分析到為什么是正常的)

在這個(gè)函數(shù)入口下條件斷點(diǎn)。

  1. kd> bp tcpip!TcpDeliverDataToClient ".if(poi(rbx+20)==0x1E4){;}.else{g;}" 
  2. kd> g 
  3. tcpip!TcpDeliverDataToClient: 
  4. fffff801`f18017a0 4055            push    rbp 
  5. kd> dd rbx+20 L1 
  6. ffffb304`06865c58  000001e4 

命中時(shí),rbx會(huì)存放一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體按照IDA的反饋來(lái)看是一個(gè)KSPIN_LOCK自旋鎖,windows內(nèi)核同步處理的一種機(jī)制,這個(gè)暫且不管,注意一下rbx結(jié)構(gòu)體+20位置的值,是1e4,這個(gè)值轉(zhuǎn)換成10進(jìn)制就是484,正好是我們發(fā)送的400個(gè)C的Data數(shù)據(jù)加剛才我們提到的頭部84字節(jié)的長(zhǎng)度。

接下來(lái)進(jìn)入TcpIndicateData函數(shù)后會(huì)命中Smb2TreeConnect_Receive函數(shù)開始進(jìn)行接收處理。

  1. kd> p 
  2. tcpip!TcpDeliverDataToClient+0x209: 
  3. fffff801`f18019a9 e8e2810100      call    tcpip!TcpIndicateData (fffff801`f1819b90) 
  4. kd> dd rbx 
  5. ffffb304`06865c38  aa9ce398 fffff801 00000000 00000000 
  6. ffffb304`06865c48  00000000 00000000 00000000 00000000 
  7. ffffb304`06865c58  000001e4 00000000 00000000 00000000 
  8. ffffb304`06865c68  00000000 00000000 00000000 00000000 
  9. ffffb304`06865c78  06865c60 ffffb304 00000000 00000000 
  10. ffffb304`06865c88  00000000 00000000 00000000 00000000 
  11. ffffb304`06865c98  00000000 00000000 00000000 00000000 
  12. ffffb304`06865ca8  00000000 00000000 00000000 00000001 
  13. kd> p 
  14. Breakpoint 1 hit 
  15. mrxsmb20!Smb2TreeConnect_Receive: 
  16. fffff801`f3fbc4b0 48895c2420      mov     qword ptr [rsp+20h],rbx 

處理過程很長(zhǎng),這里我直接略過,在處理結(jié)束后會(huì)多層ret后返回到TcpDeliverDataToClient函數(shù)中,仍然處于while循環(huán)中。

  1. kd> bp tcpip!TcpIndicateData+0x268 
  2. kd> g 
  3. Breakpoint 3 hit 
  4. tcpip!TcpIndicateData+0x268: 
  5. fffff80a`72c39df8 c3              ret 
  6. kd> p 
  7. tcpip!TcpDeliverDataToClient+0x20e: 
  8. fffff80a`72c219ae 833defa51a0001  cmp     dword ptr [tcpip!MICROSOFT_TCPIP_PROVIDER_Context+0x24 (fffff80a`72dcbfa4)],1 
  9. kd> p 
  10. tcpip!TcpDeliverDataToClient+0x215: 
  11. fffff80a`72c219b5 448bf0          mov     r14d,eax 

這里我列舉一下返回過程的逐層調(diào)用邏輯,因?yàn)閗b回溯不到。Smb2TreeConnect_Receive -> SmbReceiveInd -> VctIndRecv -> SmbWskReceiveEvent -> afd!WskProTLEventReceive -> tcpip!TcpIndicateData -> tcpip!TcpDeliverDataToClient。

接下來(lái)就是關(guān)鍵了,首先會(huì)執(zhí)行一處sub匯編指令。

  1. kd> p 
  2. tcpip!TcpDeliverDataToClient+0x2b9: 
  3. fffff80a`72c21a59 48297b20        sub     qword ptr [rbx+20h],rdi 
  4. kd> r rdi 
  5. rdi=00000000000001e4 
  6. kd> dd rbx+20 L1 
  7. ffffc10c`9fe79e78  000001e4 

這個(gè)相減之后,會(huì)將rbx結(jié)構(gòu)體對(duì)應(yīng)的長(zhǎng)度變成0,隨后,會(huì)到達(dá)一處cmp操作,這處cmp操作會(huì)將這個(gè)值作為一個(gè)判斷條件。

  1. kd> p 
  2. tcpip!TcpDeliverDataToClient+0x2de: 
  3. fffff80a`72c21a7e 4c896b48        mov     qword ptr [rbx+48h],r13 
  4. kd> p 
  5. tcpip!TcpDeliverDataToClient+0x2e2: 
  6. fffff80a`72c21a82 488b4320        mov     rax,qword ptr [rbx+20h] 
  7. kd> dd rbx+18 L1 
  8. ffffc10c`9fe79e70  00000000 
  9. kd> dd rbx+20 L1 
  10. ffffc10c`9fe79e78  00000000 
  11. kd> p 
  12. tcpip!TcpDeliverDataToClient+0x2e6: 
  13. fffff80a`72c21a86 48034318        add     rax,qword ptr [rbx+18h] 
  14. kd> p 
  15. tcpip!TcpDeliverDataToClient+0x2ea: 
  16. fffff80a`72c21a8a 0f858dfeffff    jne     tcpip!TcpDeliverDataToClient+0x17d (fffff80a`72c2191d) 
  17. kd> p 
  18. tcpip!TcpDeliverDataToClient+0x2f0: 
  19. fffff80a`72c21a90 48837e2000      cmp     qword ptr [rsi+20h],0 

來(lái)看一下這一段偽代碼。

  1. while ( 1 ) 
  2.   { 
  3.       v70 = v10
  4.       v69 = TcpSatisfyReceiveRequests(v7); 
  5.     if ( v24 >= v23 ) 
  6.     { 
  7.     } 
  8.         else 
  9.     { 
  10.       v25 = (char *)ReceiveDpcTable + 24 * v21; 
  11.       v26 = v23 - v24; 
  12.       v27 = v7[2]; 
  13.       v70 = v26
  14.       *(_QWORD *)(*(_QWORD *)(v27 + 128) + (v21 << 7) + 56) -v24
  15.       v28 = *((_DWORD *)v25 + 5); 
  16.       if ( v28 & 1 ) 
  17.         *((_DWORD *)v25 + 5) = v28 | 4; 
  18.       else 
  19.         TcpStartRcvWndTuningTimer(vars38); 
  20.       v6[4] -v26
  21.       v29 = v6[9]; 
  22.       v6[3] = 0i64; 
  23.       if ( v26 + v29 ) 
  24.       { 
  25.         TcpAdvanceTcbRcvWnd(v7, (unsigned int)(v26 + *((_DWORD *)v6 + 18))); 
  26.         v6[9] = 0i64; 
  27.       } 
  28.       else 
  29.       { 
  30.         v6[9] = 0i64; 
  31.       } 
  32.     } 
  33.     if ( !(v6[3] + v6[4]) ) 
  34.       break; 

在偽代碼最后的位置,會(huì)對(duì)兩個(gè)值進(jìn)行判斷,如果兩個(gè)值之和為0,則條件成立,程序會(huì)跳出循環(huán),剛才的跟蹤我們可以發(fā)現(xiàn),v6就是結(jié)構(gòu)體,v6[4]的值來(lái)源于它自身減v26,而v26就是它自身,最后它的值為0,而剛才跟蹤v6[3]的值也為0(如果知道結(jié)構(gòu)體就好清楚v6到底是什么了T.T)。

經(jīng)過對(duì)比調(diào)試,發(fā)現(xiàn)在正常的處理SMB Tree Connect包和觸發(fā)BSOD的不正常情況下有一處關(guān)鍵的跳轉(zhuǎn)邏輯,這里是一處if語(yǔ)句判斷,成立則break跳出while循環(huán),不成立,會(huì)繼續(xù)執(zhí)行。

 

那么不正常的情況呢?之前的處理和之前的分析一樣,我們加大Data的值到1200,但是在返回后。

  1. kd> p 
  2. tcpip!TcpDeliverDataToClient+0x2b9: 
  3. fffff80a`72c21a59 48297b20        sub     qword ptr [rbx+20h],rdi 
  4. kd> r rdi 
  5. rdi=0000000000000404 
  6. kd> dd rbx+20 
  7. ffffc10c`a0643e78  00000504 

顯而易見,在我們加大Data長(zhǎng)度的時(shí)候,到相減位置結(jié)構(gòu)體對(duì)應(yīng)位置的值是504,也就是1284,正好是Data的長(zhǎng)度1200字節(jié) + 剛才分析到的84字節(jié),而此時(shí)rdi的值只有0x404,也就是944長(zhǎng)度,這是一個(gè)Max值,如果Data長(zhǎng)度超過0x404,這里會(huì)認(rèn)為還有數(shù)據(jù),因此相減后v6[4]的值不為0。

也就是說(shuō)在SMB Tree Connect數(shù)據(jù)交互過程中,TcpDeliverDataToClient中關(guān)于這個(gè)地方的邏輯處理是,會(huì)根據(jù)數(shù)據(jù)包的長(zhǎng)度,如果數(shù)據(jù)包長(zhǎng)度小于0x404,則相減時(shí)v26的值是長(zhǎng)度本身,然后會(huì)break。如果數(shù)據(jù)包長(zhǎng)度大于0x404,則v26的值為max值,也就是0x404,相減不為0,則不會(huì)break。

  1. kd> p 
  2. tcpip!TcpDeliverDataToClient+0x2bd: 
  3. fffff80a`72c21a5d 4533ed          xor     r13d,r13d 
  4. kd> dd rbx+20 
  5. ffffc10c`a0643e78  00000100 

這造成了一個(gè)問題,就是剛才到的break位置由于v6[4]不為0,所以不執(zhí)行break,而是進(jìn)入后續(xù)的處理。

  1. kd> p 
  2. tcpip!TcpDeliverDataToClient+0x2e2: 
  3. fffff80a`72c21a82 488b4320        mov     rax,qword ptr [rbx+20h] 
  4. kd> p 
  5. tcpip!TcpDeliverDataToClient+0x2e6: 
  6. fffff80a`72c21a86 48034318        add     rax,qword ptr [rbx+18h] 
  7. kd> p 
  8. tcpip!TcpDeliverDataToClient+0x2ea: 
  9. fffff80a`72c21a8a 0f858dfeffff    jne     tcpip!TcpDeliverDataToClient+0x17d (fffff80a`72c2191d) 
  10. kd> p 
  11. tcpip!TcpDeliverDataToClient+0x17d: 
  12. fffff80a`72c2191d 49833f00        cmp     qword ptr [r15],0 
  13. kd> p 
  14. tcpip!TcpDeliverDataToClient+0x181: 
  15. fffff80a`72c21921 0f85e9010000    jne     tcpip!TcpDeliverDataToClient+0x370 (fffff80a`72c21b10) 

接下來(lái),程序會(huì)回到while入口位置,接下來(lái)會(huì)進(jìn)入之前提到?jīng)]有進(jìn)入的if語(yǔ)句處理,這是由于剛才沒有break結(jié)束循環(huán)的原因,此時(shí)會(huì)進(jìn)入if語(yǔ)句的處理,函數(shù)中所調(diào)用的函數(shù)都是Complete,猜測(cè)都是和結(jié)束數(shù)據(jù)包相關(guān)處理有關(guān)。

  1. kd> p 
  2. tcpip!TcpDeliverDataToClient+0x1c1: 
  3. fffff80a`72c21961 e99bfeffff      jmp     tcpip!TcpDeliverDataToClient+0x61 (fffff80a`72c21801) 
  4. kd> p 
  5. tcpip!TcpDeliverDataToClient+0x61: 
  6. fffff80a`72c21801 48837b0800      cmp     qword ptr [rbx+8],0 
  7. kd> dd rbx+8 
  8. ffffc10c`a0643e60  9d8c2fa0 ffffc10c 9d8c2fa0 ffffc10c 

來(lái)看一下這個(gè)if語(yǔ)句。

  1. while ( 1 ) 
  2.  { 
  3.    if ( v6[1] ) 
  4.    { 
  5.      if ( !*v5 ) 
  6.        break; 
  7.      v9 = v6[1]; 
  8.      v10 = v6[2]; 
  9.      *((_BYTE *)v6 + 98) &= 0xFEu; 
  10.      v69 = v9
  11.      v6[1] = 0i64; 
  12.      v6[2] = 0i64; 
  13.      v11 = vars30
  14.      v71 = v10
  15.      LODWORD(v12) = TcpSatisfyReceiveRequests(v7, 0, (__int64)v6, vars30, v5, &v69, &v66); 
  16.     } 
  17.   } 

在這個(gè)if語(yǔ)句中,會(huì)調(diào)用TcpSatisfyReceiveRequests函數(shù),這個(gè)函數(shù)中第六個(gè)參數(shù),也就是v69是很關(guān)鍵的,這個(gè)值決定了后面的空指針引用,接下來(lái)進(jìn)入這個(gè)函數(shù)。

  1. int __fastcall TcpSatisfyReceiveRequests(PKSPIN_LOCK SpinLock, char a2, __int64 a3, signed int a4, __int64 *a5, __int64 *a6, _DWORD *a7) 
  2.       v8 = *a5; 
  3.   v95 = SpinLock
  4.   v9 = *a6;                                     // RBP+148 
  5.       v38 = *(_QWORD *)(v9 + 48); 
  6.       v39 = *(_QWORD *)(v9 + 56); 
  7.       v40 = *(_QWORD *)(v9 + 8); 
  8.       v41 = *(_QWORD *)(v9 + 72); 
  9.       v93 += v38; 
  10.       v99 += *(_QWORD *)(v9 + 40); 
  11.       v42 = *(_QWORD *)v9; 
  12.       _guard_dispatch_icall_fptr(v40, 0i64, v38, v39);// call WskProTLReceiveComplete 

這個(gè)函數(shù)中的_guard_dispatch_icall_fptr調(diào)用了WskProTLreceiveComplete函數(shù),而v40參數(shù)和v9結(jié)構(gòu)體有關(guān),v9是由傳入第六個(gè)參數(shù),也就是剛才提到的v69有關(guān),v69又來(lái)自于v6[1],而這個(gè)結(jié)構(gòu)體是和Complete有關(guān),但是在TreeConnect數(shù)據(jù)包中卻沒有對(duì)這個(gè)結(jié)構(gòu)體進(jìn)行賦值。

隨后在WskProTLReceiveComplete中,會(huì)將rcx,也就是第一個(gè)參數(shù)v40,進(jìn)行傳遞(64位Windows系統(tǒng)中,參數(shù)傳遞通過寄存器,第一個(gè)參數(shù)是rcx,第二個(gè)是rdx,第三個(gè)是r8,第四個(gè)是r9)。在后面的分析中,省略了無(wú)關(guān)的匯編過程,只留關(guān)鍵的給大家分享。

  1. kd> p 
  2. afd!WskProTLReceiveComplete+0x34: 
  3. fffff80a`7365aa84 488bd9          mov     rbx,rcx 
  4. ………… 
  5. kd> p 
  6. afd!WskProTLReceiveComplete+0x8e: 
  7. fffff80a`7365aade 488bcb          mov     rcx,rbx 
  8. kd> r rbx 
  9. rbx=ffffc10ca01ba010 
  10. kd> p 
  11. afd!WskProTLReceiveComplete+0x91: 
  12. fffff80a`7365aae1 ff15512d0200    call    qword ptr [afd!_imp_IofCompleteRequest (fffff80a`7367d838)] 

經(jīng)過一系列傳遞后,這個(gè)第一個(gè)參數(shù)會(huì)直接傳給IofCompleteRequest函數(shù),這個(gè)函數(shù)是irp完成函數(shù),其實(shí)是一個(gè)中間過程,同步irp完成,后面就是善后工作。

在函數(shù)中,參數(shù)繼續(xù)傳遞。

  1. kd> p 
  2. nt!IopfCompleteRequest+0xb: 
  3. fffff800`9464b81b 4881ec00010000  sub     rsp,100h 
  4. kd> p 
  5. nt!IopfCompleteRequest+0x12: 
  6. fffff800`9464b822 488bd9          mov     rbx,rcx 
  7. ………… 
  8. kd> p 
  9. nt!IopfCompleteRequest+0x109: 
  10. fffff800`9464b919 488bd3          mov     rdx,rbx 
  11. kd> p 
  12. nt!IopfCompleteRequest+0x10c: 
  13. fffff800`9464b91c 488bce          mov     rcx,rsi 
  14. kd> p 
  15. nt!IopfCompleteRequest+0x10f: 
  16. fffff800`9464b91f ff5735          call    qword ptr [rdi+35h] 
  17. kd> t 
  18. Breakpoint 0 hit 
  19. mrxsmb!SmbWskReceiveComplete: 
  20. fffff80a`731d6950 48895c2408      mov     qword ptr [rsp+8],rbx 

在IofCompleteRequest函數(shù)中,會(huì)有一處調(diào)用回到SmWskReceivComplete函數(shù),而結(jié)構(gòu)體會(huì)交給rdx,也就是第二個(gè)參數(shù)進(jìn)入這個(gè)函數(shù)。隨后這個(gè)參數(shù)會(huì)連續(xù)傳遞。先來(lái)看一下之前的堆棧回溯。

  1. kd> kb 
  2. RetAddr           : Args to Child                                                           : Call Site 
  3. fffff800`9464b922 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : mrxsmb!SmbWskReceiveComplete 
  4. fffff80a`7365aae7 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!IopfCompleteRequest+0x112 
  5. fffff80a`72c60d9d : fffff800`963d54a8 ffffc10c`9ed02780 fffff800`963d54b0 fffff800`963d547c : afd!WskProTLReceiveComplete+0x97 
  6. fffff80a`72c21860 : 00000000`00000002 ffffc10c`a0643d00 00000000`00000007 00000000`00000000 : tcpip!TcpSatisfyReceiveRequests+0x3cd 
  7. 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : tcpip!TcpDeliverDataToClient+0xc0 

之后參數(shù)會(huì)連續(xù)進(jìn)行傳遞,首先會(huì)把當(dāng)前rdx+b8存放的值交給r14,之后把r14+40位置的值交給r8,最后引用的就是r8+98位置的值。

  1. kd> p 
  2. mrxsmb!SmbWskReceiveComplete+0x1d: 
  3. fffff80a`731d696d 488bda          mov     rbx,rdx 
  4. kd> p 
  5. mrxsmb!SmbWskReceiveComplete+0x20: 
  6. fffff80a`731d6970 4c8bb2b8000000  mov     r14,qword ptr [rdx+0B8h] 
  7. ………… 
  8. kd> p 
  9. mrxsmb!SmbWskReceiveComplete+0x7f: 
  10. fffff80a`731d69cf 4d8b4640        mov     r8,qword ptr [r14+40h]//1 
  11. kd> dd r14+40 
  12. ffffc10c`a01ba168  9fdf3c58 ffffc10c 

可以看到,這個(gè)過程并沒有對(duì)這個(gè)值進(jìn)行檢查,由于結(jié)構(gòu)體不透明,不能確定到底對(duì)應(yīng)存放的是什么,但其實(shí)這個(gè)結(jié)構(gòu)體的連續(xù)調(diào)用我們可以理解為KPCR -> KTHREAD -> _EPROCESS -> Token這種關(guān)系,在Windows內(nèi)核有很多這樣的域以及相關(guān)的結(jié)構(gòu)體,而相互又是嵌套的。

這個(gè)結(jié)構(gòu)體的值為0x0的原因可能就是由于這個(gè)complete部分的數(shù)據(jù)包是由于SMB Tree Connect過長(zhǎng)引起的,而mrxsmb20.sys中卻沒有對(duì)相關(guān)結(jié)構(gòu)體進(jìn)行檢查。

  1. kd> p 
  2. mrxsmb!VctIndDataReady+0x36: 
  3. fffff80a`731d6a56 498bf8          mov     rdi,r8 
  4. ………… 
  5. kd> p 
  6. mrxsmb!VctIndDataReady+0x146: 
  7. fffff80a`731d6b66 488bd7          mov     rdx,rdi 
  8. kd> p 
  9. mrxsmb!VctIndDataReady+0x149: 
  10. fffff80a`731d6b69 488bcb          mov     rcx,rbx 
  11. kd> p 
  12. mrxsmb!VctIndDataReady+0x14c: 
  13. fffff80a`731d6b6c ff15eeed0200    call    qword ptr [mrxsmb!_guard_dispatch_icall_fptr (fffff80a`73205960)] 
  14. kd> r rdx 
  15. rdx=ffffc10c9fdf3c58 
  16. kd> t 
  17. mrxsmb!guard_dispatch_icall_nop: 
  18. fffff80a`731d8a30 ffe0            jmp     rax 
  19. kd> p 
  20. mrxsmb20!Smb2TreeConnect_CopyData: 
  21. fffff80a`7546b6c0 48895c2410      mov     qword ptr [rsp+10h],rbx 

最后進(jìn)入CopyData后,會(huì)引用這個(gè)結(jié)構(gòu)體+98偏移位置的值,進(jìn)入漏洞觸發(fā)的函數(shù),而沒有對(duì)這個(gè)值進(jìn)行檢查。

  1. kd> p 
  2. mrxsmb20!Smb2TreeConnect_CopyData+0x32: 
  3. fffff80a`7546b6f2 488b8b98000000  mov     rcx,qword ptr [rbx+98h] 
  4. kd> p 
  5. mrxsmb20!Smb2TreeConnect_CopyData+0x39: 
  6. fffff80a`7546b6f9 e8c210ffff      call    mrxsmb20!Smb2ValidateNegotiateInfo (fffff80a`7545c7c0) 
  7. kd> dd rbx+98 
  8. ffffc10c`9fdf3cf0  00000000 00000000 

最后在函數(shù)中引用空指針,引發(fā)了BSOD。

責(zé)任編輯:趙寧寧 來(lái)源: 安全客
相關(guān)推薦

2017-02-07 11:00:26

2011-03-03 11:26:09

2009-10-29 13:24:41

2010-07-16 15:01:53

2009-10-21 14:31:15

漏洞補(bǔ)丁

2010-10-09 14:59:30

2009-02-03 09:06:26

2009-07-01 09:22:33

2009-10-22 11:28:38

2009-10-24 10:29:56

2009-12-03 14:52:27

2009-10-27 14:17:49

2011-12-29 09:21:09

TomcatHashtable

2013-05-17 10:43:32

2009-10-29 12:27:54

2009-10-25 12:40:29

2009-10-22 11:36:55

漏洞補(bǔ)丁

2010-01-12 11:58:14

Cisco防火墻拒絕服務(wù)漏洞

2009-10-28 10:36:38

2010-09-14 16:54:16

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲国产国产| 国产www视频在线观看| 日本午夜一区二区| 久久精品2019中文字幕| 波多野吉衣在线视频| 成人黄色动漫| 欧美国产日韩一二三区| 98国产高清一区| 亚洲综合久久网| 欧美a级在线| 亚洲摸下面视频| 天天干天天色天天干| 捆绑调教日本一区二区三区| 国产精品久久久一区麻豆最新章节| caoporn国产精品免费公开| 久久精品国产成人av| 国产精品毛片久久| 亚洲美女精品久久| 男人添女人荫蒂国产| 欧美性片在线观看| 婷婷一区二区三区| 在线天堂一区av电影| 青青免费在线视频| 丰满放荡岳乱妇91ww| 国产欧美一区二区三区久久| 男人的天堂一区二区| 在线一区电影| 最新国产成人av网站网址麻豆| 伊人av在线播放| 色综合.com| 在线视频综合导航| 久久久久久久久久久视频| 麻豆视频在线观看免费网站| 91美女精品福利| 国产精品精品软件视频| 国产又粗又黄视频| 噜噜噜在线观看免费视频日韩| 久久97精品久久久久久久不卡| 性爱在线免费视频| 国内精品视频在线观看| 亚洲精品福利在线| 国产a级黄色片| 香蕉成人app| 在线综合亚洲欧美在线视频| 自拍偷拍一区二区三区四区| 激情开心成人网| 色视频欧美一区二区三区| 国产av麻豆mag剧集| av资源一区| 亚洲国产乱码最新视频| 精品免费久久久久久久| 国产精品剧情一区二区在线观看| 中文字幕精品一区二区精品绿巨人 | 日本公妇乱淫免费视频一区三区| 欧美一区二区三区黄片| 成人精品一区二区三区中文字幕| hitomi一区二区三区精品| 久久成人在线视频| 日本精品在线免费观看| 国产精品黑丝在线播放 | 成人三级在线| 亚洲av永久纯肉无码精品动漫| 国精品**一区二区三区在线蜜桃 | 成人高潮视频| 亚洲国产精品女人久久久| www.男人天堂| 免费看成人吃奶视频在线| 亚洲欧美国产日韩天堂区| 麻豆精品免费视频| 日韩欧美中字| 欧美久久久精品| 国产一级二级三级视频| 亚洲日韩视频| 国产精品第一视频| 国产一区二区波多野结衣 | 中文字幕乱码一区| 尤物tv在线精品| 日韩综合视频在线观看| 亚洲熟女www一区二区三区| 国内揄拍国内精品久久| 欧美孕妇孕交黑巨大网站| 波多野结衣一区二区三区四区| 蜜臀精品久久久久久蜜臀| 91精品综合视频| 囯产精品一品二区三区| 久久久www成人免费无遮挡大片| 天堂√在线观看一区二区| 国产精品va在线观看视色 | 成年人午夜视频在线观看| 在线手机中文字幕| 欧美高清视频不卡网| 88av在线播放| 日韩欧美伦理| 久久久久久亚洲精品不卡| 亚洲成人第一网站| 国产一区不卡视频| 欧美日韩精品一区| а√天堂在线官网| 一本一道久久a久久精品| 日本在线观看视频一区| 欧美大奶一区二区| 久久久精品免费视频| 中文字幕亚洲高清| 韩国精品一区二区| 久久人人97超碰人人澡爱香蕉| 秋霞午夜在线观看| 婷婷一区二区三区| 亚洲一二区在线观看| 亚洲精品亚洲人成在线| 久久福利网址导航| 夜夜爽妓女8888视频免费观看| 国产麻豆欧美日韩一区| 青青草久久网络| 欧美色图天堂| 欧美日韩精品系列| 永久免费看mv网站入口78| 综合五月婷婷| 国产精品久久久久久一区二区| 丰满人妻av一区二区三区| 中国av一区二区三区| 免费成人午夜视频| 亚洲精品一区二区三区中文字幕 | 最新国产在线拍揄自揄视频| 在线精品视频免费播放| 国产麻豆xxxvideo实拍| 欧美黄色一区| 亚洲va男人天堂| 999国产在线视频| 色先锋资源久久综合| 亚洲av成人无码一二三在线观看| 欧美成人tv| 成人在线视频网站| 婷婷激情在线| 日韩欧美成人精品| 少妇光屁股影院| 亚洲免费激情| 国产女主播一区二区三区| 婷婷色在线资源| 91精品国产91综合久久蜜臀| 99精品中文字幕| 麻豆高清免费国产一区| 日韩欧美视频第二区| 成人教育av| 日韩精品中文字| 毛片基地在线观看| 久久婷婷综合激情| 欧美三级午夜理伦三级| 日韩av影院| 91大神福利视频在线| 国精品人妻无码一区二区三区喝尿| 亚洲手机成人高清视频| 天天色天天综合网| 欧美fxxxxxx另类| www.av一区视频| av福利在线导航| 亚洲国产精品成人精品| 日韩高清免费av| 久久人人97超碰com| 国产一级片黄色| 成人av二区| 91老司机精品视频| 18av在线视频| 亚洲国产欧美精品| 久久久成人免费视频| 欧美国产日本韩| 欧洲在线免费视频| 国产精品九九| 麻豆亚洲一区| 久久女人天堂| 欧美福利在线观看| 亚洲av电影一区| 91福利视频在线| 免费在线观看a级片| 高清国产一区二区| 欧美日韩中文在线视频| 菠萝蜜一区二区| 成人在线精品视频| av电影在线地址| 中文欧美在线视频| 午夜精品久久久久久久第一页按摩| 亚洲国产日韩综合久久精品| 91精品人妻一区二区| 精品亚洲国产成人av制服丝袜| 日本中文字幕一级片| 伊人久久大香线蕉无限次| 成人av番号网| 极品av在线| 在线播放国产一区二区三区| 国内精品偷拍视频| 一本色道久久综合狠狠躁的推荐| 日韩精品一区二区三区在线视频| 成人在线视频一区二区| 九色porny91| 欧美私人啪啪vps| 日韩精品最新在线观看| 6080亚洲理论片在线观看| 国产成人午夜视频网址| 午夜激情在线| 在线视频欧美日韩| 免费观看a视频| 欧美精品 日韩| 最近免费中文字幕大全免费版视频| 亚洲美女淫视频| 日本一级免费视频| a美女胸又www黄视频久久| 日本高清久久久| 亚洲一区二区伦理| 中文字幕人妻熟女人妻洋洋| jvid福利在线一区二区| 国产精品久久久久久久久久久久冷 | 国产女主播在线播放| 日韩av一区二| 女人和拘做爰正片视频| 国产综合网站| www.午夜色| 欧美日韩中字| 久久精品日韩| 91欧美极品| 成人在线国产精品| 日韩免费小视频| 5566成人精品视频免费| 丰乳肥臀在线| 久久av资源网站| 免费黄色电影在线观看| 国产一区二区三区久久精品 | 国产精品裸体瑜伽视频| 欧美日韩少妇| 欧美性受xxxx黑人猛交88| 日韩精品一区二区久久| 日本精品二区| 伊人春色精品| 免费精品视频一区| 人人网欧美视频| 国产主播一区二区三区四区| av动漫精品一区二区| 99久久自偷自偷国产精品不卡| 白嫩亚洲一区二区三区| 国产在线观看精品| 日韩电影精品| 成人xvideos免费视频| 国产精品videossex撒尿| 国产精品极品尤物在线观看| 欧美gay视频| 日本久久中文字幕| 成人福利av| 国产精品成人播放| 全球最大av网站久久| 国产精品久久久久久久天堂| 日本综合视频| 成人黄色av播放免费| 国产日本亚洲| 99久热re在线精品996热视频| 一区二区日韩| 国产区二精品视| 色爱综合av| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 深夜福利在线视频| 国产网站欧美日韩免费精品在线观看 | 日韩不卡在线观看| 久草在线网址| 中文字幕在线观看亚洲| 日本在线观看| 欧美成人精品在线观看| gogo高清在线播放免费| 日本国产高清不卡| 99久久综合国产精品二区| 91免费看国产| 国产精品一区二区三区美女| 精品国产乱码久久久久久蜜柚 | 日韩中文字幕在线免费| 国产日韩欧美在线播放不卡| 无码内射中文字幕岛国片| 蜜臀av亚洲一区中文字幕| 久久精品亚洲天堂| 成人av免费在线观看| 一色道久久88加勒比一| 最新热久久免费视频| 日韩欧美国产亚洲| 在线观看91视频| 国产男女裸体做爰爽爽| 日韩成人在线播放| 浮生影视网在线观看免费| www.亚洲成人| 高潮在线视频| 国产欧美一区二区三区久久 | 国模娜娜一区二区三区| 日韩少妇一区二区| 中文字幕精品一区二区三区精品| www青青草原| 色域天天综合网| 国产黄频在线观看| 亚洲男人的天堂在线| 黄网站免费在线播放| 97香蕉超级碰碰久久免费的优势| 国产91在线播放精品| 国产一区二区三区四区五区加勒比| 精品美女久久久| 国产成人永久免费视频| 免费在线观看日韩欧美| 国产日韩视频一区| 秋霞在线一区| 亚洲国产成人精品一区二区 | 粉嫩一区二区三区在线观看| 久久99久久精品国产| 99久久久久| 亚洲人成色77777| 国产91在线看| 999精品视频在线观看播放| 狠狠色香婷婷久久亚洲精品| 国产三级在线观看视频| 中文字幕国产日韩| 女海盗2成人h版中文字幕| 99re视频在线| 久久影视一区| 日韩中文字幕免费在线| 成人视屏免费看| 黄色片在线观看网站| 欧美三级乱人伦电影| 日本福利在线观看| 久久久久久国产免费| 国产视频一区二区在线播放| 亚洲国产一区二区在线| 久久激情综合| 亚洲啪av永久无码精品放毛片| 成人欧美一区二区三区黑人麻豆| 夜夜爽妓女8888视频免费观看| 亚洲精品乱码久久久久久按摩观| 超碰个人在线| 91精品在线看| 亚洲人体av| 毛片毛片毛片毛| 国产精品日韩精品欧美在线| 欧美日韩乱国产| 亚洲第一级黄色片| 丁香影院在线| 动漫一区二区在线| 欧美色图麻豆| av电影中文字幕| 亚洲一区二区视频在线观看| 亚洲成人一二三区| 欧美老少配视频| 日韩精品一区国产| 精品视频在线观看一区二区| 国产伦精品一区二区三区视频青涩 | 免费在线国产| 欧美亚洲成人免费| 日本亚洲不卡| 日韩在线xxx| 国产视频一区不卡| 中文字幕一区2区3区| 深夜福利国产精品| 国产精品亚洲综合在线观看| 在线观看免费91| 国产麻豆精品在线| 国产亚洲欧美久久久久 | 北岛玲日韩精品一区二区三区| 日韩av电影在线免费播放| 精品国产一级毛片| 色www免费视频| 亚洲黄色av一区| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 国内精品小视频| 免费看日本一区二区| 天天干天天综合| 亚洲欧美一区二区三区国产精品| 国产福利免费视频| 97热在线精品视频在线观看| 九九视频精品全部免费播放| 日韩一区二区三区不卡视频| 亚洲色图视频网| 日本黄色一区二区三区| 日韩av大片免费看| 欧美激情黄色片| 在线观看成人动漫| 色婷婷亚洲综合| 主播国产精品| 欧美精品免费观看二区| 美女视频黄a大片欧美| 欧美精品一级片| 亚洲欧美日韩国产中文专区| 91精品国产一区二区在线观看| 国产天堂视频在线观看| 久久夜色精品国产欧美乱极品| 手机在线免费毛片| 亚洲大胆在线| 色婷婷精品久久二区二区密| 91国产视频在线观看| 成年人黄视频在线观看| 免费不卡亚洲欧美| 国产乱人伦偷精品视频不卡| 欧美黑人一区二区| 欧美理论电影在线观看| 综合色就爱涩涩涩综合婷婷| 中文国产在线观看| 欧美日韩亚洲天堂| 日本h片在线观看| 午夜精品电影在线观看| 成人免费高清在线观看| 夜夜躁狠狠躁日日躁av| 午夜免费日韩视频|