在C中的recv()中是否可能有缓冲区溢出?

时间:2012-03-05 10:53:28

标签: c buffer-overflow recv

我想知道我的应用程序中有缓冲区溢出。 例如,我有这段代码:

    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 :(得分:0)

发送(client_fd,“登录:”,BUFSIZE,0);

- 对于此语句,send将尝试发送BUFSIZE字节,尽管您的字符串仅为“Login:”。 send本身并不试图理解'C'字符串。它只识别一个字节流。因此,您的发送声明不正确。

的recv(client_fd,用户名,的sizeof(用户名),0)

- 如果是recv,虽然你提到过“sizeof(用户名)”,但这并不意味着它会返回“sizeof(username)”字节,返回的字节数可以通过返回值找到recv。在不检查recv的返回值的情况下,永远不要尝试解释传递给recv的缓冲区的内容。但是,指定sizeof(用户名)可确保即使网络缓冲区中存在更多字节数,recv调用也不会返回超过sizeof(用户名)字节。