C++ 这个程序没有给我打开一个外壳 #包括 #包括 #包括 #包括 int main(int argc,字符**argv){ 文件*fp=fopen(“1.pass”,“r”); 结构{char pass[20],msg_err[20];}pwfile={{0}}; char-ptr[0]; 如果(!fp | | argc!=2) 返回-1; fread(pwfile.pass,1,20,fp); pwfile.pass[19]=0; ptr[atoi(argv[1])]=0; fread(pwfile.msg_err,1,19,fp); fclose(fp); 如果(!strcmp(pwfile.pass,argv[1])){ setuid(0); execl(“/bin/sh”,“sh”,0); }否则 puts(pwfile.msg_err); 返回0; }

C++ 这个程序没有给我打开一个外壳 #包括 #包括 #包括 #包括 int main(int argc,字符**argv){ 文件*fp=fopen(“1.pass”,“r”); 结构{char pass[20],msg_err[20];}pwfile={{0}}; char-ptr[0]; 如果(!fp | | argc!=2) 返回-1; fread(pwfile.pass,1,20,fp); pwfile.pass[19]=0; ptr[atoi(argv[1])]=0; fread(pwfile.msg_err,1,19,fp); fclose(fp); 如果(!strcmp(pwfile.pass,argv[1])){ setuid(0); execl(“/bin/sh”,“sh”,0); }否则 puts(pwfile.msg_err); 返回0; },c++,C++,你好。 我给程序输入密码。程序将检查该密码,该密码位于1.pass。如果一切正常-向我打开一个shell,如果它不正确-打印访问被拒绝。 在我的情况下,它没有打开壳牌对我来说,我不知道为什么。你知道我错过了什么吗 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(int argc, char **argv){

你好。 我给程序输入密码。程序将检查该密码,该密码位于
1.pass
。如果一切正常-向我打开一个shell,如果它不正确-打印
访问被拒绝
。 在我的情况下,它没有打开壳牌对我来说,我不知道为什么。你知道我错过了什么吗

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv){
        FILE *fp = fopen("1.pass", "r");
        struct {char pass[20], msg_err[20];} pwfile = {{0}};
        char ptr[0];

        if(!fp || argc != 2)
                return -1;

        fread(pwfile.pass, 1, 20, fp);
        pwfile.pass[19] = 0;
        ptr[atoi(argv[1])] = 0;
        fread(pwfile.msg_err, 1, 19, fp);
        fclose(fp);

        if(!strcmp(pwfile.pass, argv[1])) {
                setuid(0);
                execl("/bin/sh", "sh", 0);
       } else
                puts(pwfile.msg_err);

        return 0;
}

这不是合法的C++,因为C++中没有零大小的数组。即使一些C++编译器提供零大小的数组作为扩展,这个特定的代码也不会做任何有用的事情,可能或可能不格式化你的硬盘。

我希望这会发生:SH只是我系统使用的BASH链接,代码> Ff -你的程序< /Cord>,以验证它所做的事情。也许执行程序产生了一个你没有发现的错误信息。试试使用调试器。作为一个侧面的注释,如果你使用C++,使用适当的习惯性C++。C代码最好由C编译器处理
char ptr[0];
ptr[atoi(argv[1])] = 0;