Похоже, оно никак не может правильно посчитать и набрать 31337. Помогите.

Solution

Погнали реверсить.

Анализ main

  int32_t main(int32_t argc, char** argv, char** envp)

  {
      int32_t var_c = 0;
      int64_t rax;
      (uint8_t)rax = 0;
      int32_t var_14 = printf("Let's do some important calculations...\n");
      int32_t rax_1;
      (uint8_t)rax_1 = 0;
      int32_t var_10 = obfuscated_calculate_something();
      int32_t rax_2;
      (uint8_t)rax_2 = 0;
      printf("Result: %d\n", (uint64_t)var_10);
      int64_t rax_3;
      
      if (var_10 == 31337)
      {
          (uint8_t)rax_3 = 0;
          int32_t var_18_1 = printf("OK, looks like you're aligible for a flag!\n");
          obfuscated_give_flag(var_10);
      }
      else
      {
          (uint8_t)rax_3 = 0;
          printf("It's not eleet, so it's not worth a flag\n");
      }
      return 0;
  }

Нет никакого желания разбирать функции, начинающиеся с префикса obfuscated. На первый взгляд кажется, что obfuscated_calculate_something() делает какие-то вычисления и возвращает число. Далее оно выводится через printf. Если число равно 31337, то мы получим флаг. Запущу бинарь:

IMG

Примерно так я и подумал. Запущу еще пару раз, чтобы понять, меняется ли число:

IMG

И нет. Оно не изменяется. Полезу в отладчик.

Отладка

Первая моя мысль - попробовать вызвать функцию obfuscated_give_flag(int). Об этом я уже писал ранее.

IMG

А вот и флаг:

spbctf{w3_g0t_s0me_31337_d00d_over_h3r3}

Можно так же попатчить память через отладчик. Думаю, что можно было бы и пропатчить бинарь, чтобы в функцию всегда передавалось значение 31337. Но особого смысла это не имеет. Подробнее о таком можно посмотреть вот тут.