Now guess the string! App is compiled with optimizations, string functions may look scary.

Solution

strace и ltrace

strace показывает только read/write — сравнение внутри бинаря, строка не видна:

$ strace ./mc6.elf
...
write(1, "I'm thinking of a string...", 42) = 42
read(0, "123\n", 1024) = 4
write(1, "No!\n", 4) = 4

ltrace тоже не помогает — библиотечных strcmp нет (компилятор заинлайнил):

$ ltrace ./mc6.elf
puts("GUESS THE STRING game!")
printf("I'm thinking of a string...")
__isoc99_scanf(...)
puts("No!")

GDB + rebase

$ file mc6.elf
mc6.elf: ELF 64-bit LSB pie executable, x86-64, stripped

PIE — использую rebase. Нахожу в декомпиляторе место побайтового сравнения:

00400af0  movzx   edx, byte [rbx+rax]   ; символ из ввода
00400af4  add     rax, 0x1
00400af8  cmp     dl, byte [rsi+rax]    ; символ из эталонной строки
00400afb  jne     0x400b1a

Ставлю брейкпоинт на 0xaf8:

pwndbg> b __isoc99_scanf
pwndbg> r
pwndbg> b *$rebase(0xaf8)
pwndbg> c

0x555555400af8    cmp    dl, byte ptr [rsi + rax]     0x34 - 0x66

Флаговая строка лежит по rsi+rax:

pwndbg> x/s $rsi+$rax
0x7fffffffe3a0: "flag{xedxicorts}"

Проверяю:

$ ./mc6.elf
GUESS THE STRING game!
I'm thinking of a string... What is it? > flag{xedxicorts}
Correct! This string is the flag
flag{xedxicorts}