【问题标题】:Segfault at _IO_ getc when reading file读取文件时 _IO_ getc 处的段错误
【发布时间】:2014-07-13 20:23:16
【问题描述】:

我正在为我的学校建立一个基本的 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

任何想法,让我知道。谢谢!

【问题讨论】:

  • 什么是“CTF”?大概fpNULLfopen 之后。为什么你认为用户/组argcimapirate 可以访问用户/组flag
  • 呃,大会在哪里?
  • 1.) 这将被编译并保存为二进制文件以进行静态分析。 2.) 我认为 setgid 会让他们访问该文件?
  • 你怎么知道gid 1401是组标志?
  • 您确认 setgid() 成功了吗?变化是它失败了。你检查 fopen() 成功了吗?机会是......

标签: c file io segmentation-fault


【解决方案1】:

我已经解决了伙计们。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多