【问题标题】:Is it possible to have a buffer overflow in recv() in C?是否可能在 C 中的 recv() 中出现缓冲区溢出?
【发布时间】:2012-03-05 10:53:28
【问题描述】:

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

    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 吗?

【问题讨论】:

  • 不要忘记 C 字符串需要空格来存放终止符号 '\0'。目前,UDP 操作可能会完全填充您的用户名,从而呈现无效的 C 字符串,这可能会在以后使您的程序崩溃。检查 recv 的返回值来捕捉它并自己添加一个\0

标签: c buffer-overflow recv


【解决方案1】:

send(client_fd, "登录:", BUFSIZE, 0);

-- 对于这个语句,虽然你的字符串只是“Login:”,send 将尝试发送 BUFSIZE 字节。 send 本质上不会尝试理解“C”字符串。它只识别字节流。所以,你的 send 语句是不正确的。

recv(client_fd,username,sizeof(username),0)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 2012-01-09
    • 2011-02-01
    • 2013-02-17
    • 2011-09-07
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多