Sometimes the string variable contains flag. Most of times not.
Solution
Анализ
int32_t main(int32_t argc, char** argv, char** envp)
{
int64_t var_78;
__builtin_memcpy(&var_78, "\xe8\xc0\x6c\x66...", 0x18);
char var_58;
for (int32_t i = 0; i <= 0x1869f; i += 1)
{
void* rax_1 = malloc(0x18);
sprintf(&s, "%d", (uint64_t)i);
hooyeah(&s, 6);
while (var_94_1 < 0x17)
{
*(uint8_t*)(var_94_1 + rax_1) = yahooo() ^ *(uint8_t*)(&var_78 + var_94_1);
var_94_1 += 1;
}
memcpy(&var_58, rax_1, 0x17);
free(rax_1);
}
return (int32_t)var_58;
}
Цикл перебирает 100 000 вариантов: XOR-ит байты с результатом yahooo() и складывает в буфер через memcpy. Статически разбирать это долго — memcpy вызывается на каждой итерации, в какой-то момент там окажется флаг.
ltrace
Запускаю ltrace и перенаправляю в файл — вывод большой:
$ ltrace -o trace ./flagbruter.elf
Ищу memcpy без экранированных байт (т.е. где значение читаемое):
$ grep memcpy trace | grep -v '\\'
memcpy(0x7ffd2400b670, "FLAGus_flagus_asparagus", 23) = 0x7ffd2400b670
FLAGus_flagus_asparagus