Похоже, оно никак не может правильно посчитать и набрать 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, то мы получим флаг. Запущу бинарь:

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

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

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