Как удалить segfault удаленно (ctf) - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть несколько проблем ctf, но эта действительно мне подходит. Можно ли редактировать строки кода удаленно? В коде soucre (представленном ниже) этот код вызовет system (), но в строке 12 bool отключает вызов. Кроме того, в void newsletter () он запускает segfault, но я не совсем понимаю, что он делает или как его обойти / изменить. Спасибо!

Я пытался просто ввести команды, которые будут проходить, например, ввести 2, а затем | чтобы добавить команды, но ни одна из них не показывает вывод. Я действительно застрял и понятия не имею, куда идти отсюда.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>

void check_date();
void newsletter();

bool date_enabled = false;

int main() {
   gid_t gid = getegid();
   setresgid(gid, gid, gid);
   setbuf(stdout, NULL);

   printf("Welcome to the new portal!\n");
   char action = 0;
   char line[128];
   while (action != 'x') {
      printf("What would you like to do?\n");
      printf("1.) Sign up for our newsletter!\n");
      printf("2.) Check the date.\n");
      printf("x.) Exit.\n");
      fgets(line, sizeof line, stdin);
      action = line[0];
      if (action == '1') {
         newsletter();
      } else if (action == '2') {
         check_date();
      } else if (action != 'x') {
         printf("Sorry, I didn't recognize that.\n");
      }
      printf("\n");
   }
}

void check_date() {
   printf("Here's the current date:\n");
   if (date_enabled) {
      system("/bin/date");
   } else {
      printf("Sorry, date has been disabled.\n");
   }
}

void newsletter() {
   printf("Thanks for signing up for our newsletter!\n");
   printf("Please enter your email address below:\n");

   char email[256];
   fgets(email, sizeof email, stdin);
   printf("I have your email as:\n");
   printf(email);
   printf("Is this correct? [Y/n] ");
   char confirm[128];
   fgets(confirm, sizeof confirm, stdin);
   if (confirm[0] == 'Y' || confirm[0] == 'y' || confirm[0] == '\n') {
      printf("Great! I have your information down as:\n");
      printf("Name: Evan Shi\n");
      printf("Email: ");
      printf(email);
   } else {
      printf("Oops! Please enter it again for us.\n");
   }

   int segfault = *(int*)0;
}

с момента написания нескольких команд, таких как 2 | Это не работает, я не знаю, что еще я могу сделать. Для этого ctf мне нужно найти в коде флаг, который выглядит как tjctf {actualflaggoeshere}, или иметь возможность каким-то образом его получить.

...