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