如何使用格式说明符检索当前目录之外的文件?

时间:2018-11-19 08:24:36

标签: c file code-injection format-specifiers

char * read_file(char * filename) {
  char * file_contents = malloc(4096 * sizeof(char));

  FILE * file;
  file = fopen(filename, "r");

  fread(file_contents, 4096, sizeof(char), file);
  fclose(file);

  return file_contents;
}

char * read_flag() {
  return read_file("/flag.txt");  // outside of current working directory ;)
}

int main(int argc, char* argv[]) {
  setvbuf(stdin,  NULL, _IONBF, 0);
  setvbuf(stdout, NULL, _IONBF, 0);

  char * flag = read_flag();
  char input_filename[40];

  //Current directory is /home/problem
  printf("Current working directory is: ");
  system("pwd");

  printf("Enter a filename to print the contents of the file => ");
  scanf("%39s", input_filename);

  while ((directory_entry = readdir(directory)) != NULL) {
    if (strcmp(input_filename, directory_entry->d_name) == 0) {
      printf("File contents:\n");
      printf("%s\n", read_file(input_filename));

      return 0;
    }
  }
}

我需要打开该目录之外的文件(“ /flag.txt”)。我已经尝试在输入中输入类似“ ../”的内容来从该目录中退出,但是它不起作用。我不确定如何输入文件名,以便它可以检索/ home / problem目录之外的文件。我目前正在使用Ubuntu来执行此操作。我认为当我输入输入内容时,该想法应该使用%s%d之类的方法。是否可以使用任何说明符或利用此程序来读取全部内容?

2 个答案:

答案 0 :(得分:1)

如果文件位于解决方案目录之外,则需要使用\\或一个/将完整路径传递到文件。在基于Windows的系统上,例如为C:\\folder\\file.txt。我目前不使用linux,但应该为/home/folder/file.txt

答案 1 :(得分:0)

fopen函数可能会失败,因此您应该处理该问题。阅读fopen(3)open(2)path_resolution(7)errno(3),以了解可能的故障原因。详细信息可能是文件系统和计算机特定的(并且可能包括硬件故障)。

我建议在失败时使用perror(3)exit(3)(不要忘记同时将<stdio.h>的{​​{1}}和perror的{​​{1}}都包括在内):

<stdlib.h>

然后,您将在失败时收到有意义的错误消息(放入exit中)

我的猜测:您的根file system(和root directory FILE* file = fopen(filename, "r"); if (!file) { perror(filename); exit(EXIT_FAILURE); } ...)没有stderr文件,您可能想获取{{ 3}}从/了解到。也许您想在主目录中检索它(然后在Linux或Unix上使用flag.txt构建它的文件路径;请参阅shell)。

还请阅读有关thisglobbing的信息。

还要阅读一些Linux编程书籍,也许是旧的glob(7)