【发布时间】:2017-05-12 13:49:57
【问题描述】:
两天来,我一直在为 Windows Sockets 苦苦挣扎,无法像在 Linux 中那样使用 write to socket。我想编写自己的 shellcode,并且正在研究如何将 stdout、stdin 重定向到套接字句柄(这就是我的游戏来源)。如果需要,我使用 Windows 7 x64,构建 7601。这是我的代码
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main (int argc,char ** argv)
{
// boring code starts
if (argc < 2)
{
printf("Usage getstdhandle <ip> <port> ");
}
WSADATA wsadata;
int result = WSAStartup (MAKEWORD(2,2),&wsadata);
if (result != NO_ERROR)
{
printf("error with wsastartup");
}
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons (atoi(argv[2]));
server.sin_addr.s_addr = inet_addr (argv[1]);
SOCKET soc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (soc == INVALID_SOCKET)
{
printf("Error with creating socket");
}
if (connect(soc,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
{
printf("Problem with connecting");
}
// boring code ends
const char * buf = "Tekscik \n"; // know it's not really good in new C standards
const char buf[] = "Test\n"; // not working also, shouldn't have any influence
bool isSent = WriteFile((HANDLE)soc,(LPCVOID)buf,(DWORD)10,NULL,NULL);
DWORD ret = GetLastError();
printf("%.08x",ret);
closesocket(soc);
WSACleanup();
return 0;
}
这就是我运行程序的方式
C:\Users\Domin568\Desktop>getstdhandle 192.168.56.1 5555
Tekscik
00000057 <---- Error code in hex
在我的第二台机器上,我只是运行 nc 来监听这些数据,如下所示:
15:14|domin568[21] ~ $ nc -l -v -p 5555
Connection from 192.168.56.101:50328
15:15|domin568[22] ~ $
我收到错误代码 0x57,即:
ERROR_INVALID_PARAMETER 87 (0x57) 参数不正确。
Local network traffic(任何数据发送,纯连接握手和FIN)
这可能是什么原因?我知道这不是发送数据的好方法,但 MSDN 说它应该是可能的。
【问题讨论】:
-
在这种情况下使用
OVERLAPPED ov = {}; BOOL isSent = WriteFile((HANDLE)soc,(LPCVOID)buf,(DWORD)10, 0, &ov);会起作用 -
错误处理被破坏,只有在函数失败时才调用 GetLastError()。如果你在它没有失败时调用它,那么你会得到一个任意数字。
标签: c windows sockets writefile