我正在为学校设置一个基本的CTF,其中的挑战之一就是简单地分析二进制文件的ASM(x86),弄清楚它的工作原理并破坏它。这很简单:向其推送37个参数,您将升级为读取目录中标志的“标志”用户,并获得积分。

但是由于某种原因,在读取标志时我遇到了段错误。

这是代码:

void readflag()
{
        setgid(1401);
        char ch;
        FILE *fp;
        fp=fopen("argcimapirate.flag", "r");
        while( ( ch = fgetc(fp) ) != EOF )
                printf("%c",ch);
        fclose(fp);
}

int main(int argc, char* argv[])
{
        printf("ARRRRRRR!\n");
        if (argc == 37)
        {
                printf("Shiver me timbers...\n");
                readflag();
        }
        return 0;
}


另外,这是ls -l的输出,以查看权限。

-r-sr-s--- 1 argcimapirate argcimapirate 8811 Jul 13 15:58 argcimapirate
-r-------- 1 root          root           335 Jul 13 15:58 argcimapirate.c
-r--r----- 1 flag          flag            17 Jul 11 21:12 argcimapirate.flag


有什么想法,请告诉我。谢谢!

最佳答案

伙计们,我已经解决了。

事实证明,标志用户需要拥有文件才能使setuid / setgid升级到用户可以读取标志拥有的文件的位置。

10-08 13:37