Guess the number once again! App won’t keep it in a variable this time.
Solution
Анализ
int32_t main(int32_t argc, char** argv, char** envp)
puts("Third GUESS THE NUMBER game!")
printf("I will think of a number soon... What is it? > ")
int32_t var_c
__isoc99_scanf("%d", &var_c)
if (0xffffff != var_c)
puts("No!")
else
puts("Correct! This number is the flag")
Декомпилятор показывает 0xffffff как константу — но это неточно. В дизассемблере видно вызов:
00400e0d call return_scary_number
00400e12 mov edx, eax ; результат функции
00400e14 mov eax, dword [rbp-0x4] ; наш ввод
00400e17 cmp edx, eax
00400e19 jne 0x400e29
Число возвращает return_scary_number — декомпилятор её не раскрыл. Нужна динамика.
GDB + rebase
$ file mc7.elf
mc7.elf: ELF 64-bit LSB pie executable, x86-64, not stripped
PIE, поэтому использую rebase. Ставлю брейкпоинт на cmp (0xe17):
pwndbg> b __isoc99_scanf
pwndbg> r
pwndbg> b *$rebase(0xe17)
pwndbg> c
0x555555400e17 <main+76> cmp edx, eax 0x8d1b1a - 0x11
Первый операнд edx = 0x8d1b1a. Переводю:
0x8d1b1a = 9247514
$ ./mc7.elf
Third GUESS THE NUMBER game!
I will think of a number soon... What is it? > 9247514
Correct! This number is the flag
9247514