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