Solution
Нужно глянуть информацию о файле. Ух, все еще ELF:
Info:
File name: /spbctf_rev/mixer/mixer
Size: 16384
File type: ELF64
String: ELF(AMD64)
Extension: so
Operation system: Debian Linux(ABI: 3.2.0)
Architecture: AMD64
Mode: 64-bit
Type: DYN
Endianness: LE
Гляну строки:

Чутка полезного есть. Give me the key: находится в main, поэтому с нее и начну анализ.
Анализ main
Код не сложный:
int32_t main(int32_t argc, char** argv, char** envp)
{
puts("Give me the key: ");
char buf[0x10c];
fgets(&buf, 0xff, stdin);
int32_t rax = strlen(&buf);
buf[(uint64_t)(rax - 1)] = 0;
char var_218[0x100];
var_218[(uint64_t)(rax - 2)] = 0;
modify(&buf, &var_218, rax - 1);
if (strcmp(&var_218, "k_mfblobadb{udp{idp4{iaxz"))
puts("Incorrect");
else
puts("Correct");
return 0;
}
На вход подаем ключ. Этот ключ загоняется в функцию modify, а далее сравнивается с k_mfblobadb{udp{idp4{iaxz. Пойду разбирать modify
Анализ modify
int64_t modify(char* buf, char* key, uint32_t len)
{
int32_t i;
for (i = 0; i < len; i += 1)
{
int32_t pos = 0;
while ((uint64_t)pos < strlen("abcdefghijklmnopqrstuvwxyz_{}0123456789"))
{
if (chars_order[(uint64_t)pos] == buf[(uint64_t)i])
break;
pos += 1;
}
key[(uint64_t)i] = data_402030[(uint64_t)pos];
}
return i;
}
Я вижу 2 цикла. Первый цикл нужен для прохода по всем символам буфера. Второй используется для поиска позиции символа из buf в захардкоженной последовательности. После определения позиции происходит запись символа из другой последовательности data_402030. В key[i] записывается data_402030[pos]. По факту это перестановочный шифр. А вот нужные нам полседовательности.
char const chars_order[0x28] = "abcdefghijklmnopqrstuvwxyz_{}0123456789", 0
char const data_402030[0x28] = "wmf9slha2r}v7te_13kby8ug4c{oz5j0idp6nqx", 0
Пишу декодер
Итоговая последовательность символов у нас вот такая k_mfblobadb{udp{idp4{iaxz. Используем алгоритм в обратном порядке.
if __name__ == '__main__':
encode = 'wmf9slha2r}v7te_13kby8ug4c{oz5j0idp6nqx'
decode = 'abcdefghijklmnopqrstuvwxyz_{}0123456789'
s = 'k_mfblobadb{udp{idp4{iaxz'
print(''.join([decode[encode.find(c)] for c in s]))
Можно было вообще все в одну сроку засунуть. Но это уже точно не имеет смысла)
root@8e575889c4ed:/rev# python3 solver.py
spbctf{th4t_w45_345y_3h9}
Проверю в бинаре:
root@8e575889c4ed:/rev# ./mixer
Give me the key:
spbctf{th4t_w45_345y_3h9}
Correct