Возможно ли переполнение буфера в recv () в C? - PullRequest
0 голосов
/ 05 марта 2012

Меня интересует переполнение буфера в моем приложении.Например, у меня есть этот код:

    enum { BUFSIZE = 1024};
    char username[this->BUFSIZE];
    memset(username,0,BUFSIZE);
    char password[this->BUFSIZE];
    memset(password,0,BUFSIZE);

    send(client_fd, "Login: ", BUFSIZE, 0);
    recv(client_fd,username,sizeof(username),0)

Может ли злоумышленник напечатать более 1024 символов и сделать bof?

1 Ответ

0 голосов
/ 05 марта 2012

send (client_fd, "Login:", BUFSIZE, 0);

- Для этого оператора send попытается отправить байты BUFSIZE, хотя ваша строка - только "Login:".send по сути не пытается понять строку 'C'.Он просто распознает поток байтов.Итак, ваше утверждение для отправки неверно.

recv (client_fd, имя пользователя, sizeof (имя пользователя), 0)

- В случае recv, хотя вы упомянули «sizeof (имя пользователя)", это не значит, что он вернет байты" sizeof (username) ", количество возвращаемых байтов можно узнать с помощью возвращаемого значения recv.Никогда не пытайтесь интерпретировать содержимое буфера, переданного в recv, без проверки возвращаемого значения recv.Но указание sizeof (имя пользователя) гарантирует, что вызов recv не вернет больше байтов sizeof (имя пользователя), даже если в сетевом буфере присутствует большее количество байтов.

...