我正在处理一个CTF难题,而且我仍然坚持使用"文件输入"片。我试图通过的代码:
FILE* fp = fopen("\x0a", "r");
if(!fp) return 0;
if(fread(buf, 4, 1, fp) != 1) return 0;
if(memcmp(buf, "\x00\x00\x00\x00", 4)) return 0;
fclose(fp);
它试图打开一个名为\x0a
的文件(即换行符)并不存在,其中一个限制也就是我无法创建所述文件。
我已尝试将文件描述符重定向到该程序,但它似乎无法正常工作。
echo -e "\x00\x00\x00\x00" | ./input 4>&0 63>&0
我分别从4
和63
的输出中尝试文件描述符ls /dev/fd
和bash -c 'echo <(echo)'
。
这种方法有误吗?是否有另一种通过输入重定向模拟不存在的文件的方法?
答案 0 :(得分:1)
正如一些评论所说,输入重定向是在程序启动之前进行的。它是由启动程序的shell组成的,因此您无法从程序中更改它。
要获取名称为&#34; \ n&#34;的文件,只需执行以下操作:
$ echo "whatever you want to put in the file" >"
> "
并且您将获得名为"\n"
此外,在字符串文字中使用\0
并不好,因为编译器会在字符串的末尾添加额外的'\0'
,因此您可能会遇到五个字符串\0
而不是四个。
最后,请记住,您无法重定向您在程序中打开的文件。文件重定向是程序收到的文件已经打开的状态,通常是stdin
,stdout
和stderr
。您可以重定向其他人,但您必须假设您只接收这些标准文件的常开描述符。
执行./input 4>&0 63>&0
时,您dup(2)
标准输入(描述符0
,很可能是您执行该命令的终端)到描述符4
和{ {1}},您在程序中打开的文件没有任何反应。