Guess the number again. Flag is the correct one.
Solution
Анализ
int32_t main(int32_t argc, char** argv, char** envp)
puts("GUESS THE SAME NUMBER AGAIN game!")
int32_t var_c = 0xffffff
printf("I'm thinking of a number... What is it? > ")
int32_t var_10
__isoc99_scanf("%d", &var_10)
if (var_10 != var_c)
puts("No!")
else
puts("Correct! This number is the flag")
return 0
Число константное, 0xffffff = 16777215. Казалось бы — вот ответ. Но:
$ file mc5.elf
mc5.elf: ELF 64-bit LSB pie executable, x86-64, stripped
PIE — сегменты загружаются в рандомное место. Захожу в GDB и пытаюсь поставить брейкпоинт по статическому адресу 0x400e12:
pwndbg> b *0x00400e12
Cannot insert breakpoint 1.
Cannot access memory at address 0x400e15
Не работает — адрес уехал. Нужно дождаться загрузки и использовать rebase.
rebase в pwndbg
Ставлю брейкпоинт на scanf (он всегда доступен), запускаю, затем добавляю брейкпоинт через $rebase:
pwndbg> b __isoc99_scanf
pwndbg> r
...
pwndbg> b *$rebase(0xe12)
pwndbg> c
► 0x555555400e12 cmp eax, dword ptr [rbp - 4] 0x2a - 0x3e9d1e
Второй операнд 0x3e9d1e — и есть загаданное число. Перевожу в десятичную:
0x3e9d1e = 4103454
Проверяю:
$ ./mc5.elf
GUESS THE SAME NUMBER AGAIN game!
I'm thinking of a number... What is it? > 4103454
Correct! This number is the flag
4103454