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