【发布时间】: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”?大概
fp是NULL在fopen之后。为什么你认为用户/组argcimapirate可以访问用户/组flag? -
呃,大会在哪里?
-
1.) 这将被编译并保存为二进制文件以进行静态分析。 2.) 我认为 setgid 会让他们访问该文件?
-
你怎么知道
gid 1401是组标志? -
您确认 setgid() 成功了吗?变化是它失败了。你检查 fopen() 成功了吗?机会是......
标签: c file io segmentation-fault