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}