我正在为学校设置一个基本的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升级到用户可以读取标志拥有的文件的位置。