c++ - `recv()` 会导致缓冲区溢出吗?

标签 c++ c sockets buffer-overflow recv

我正在介绍自己使用 C/C++ 进行套接字编程,并使用 send()recv() 在客户端和服务器程序之间交换数据TCP 套接字。

以下是我的代码的一些相关摘录:

server.c:

char recv_data[1024];

// Socket setup and so on ommited...

bytes_recieved = recv(connected, recv_data, 1024, 0);
recv_data[bytes_recieved] = '\0';

client.c:

char send_data[1024];

// Setup ommited...

send(connected, send_data, strlen(send_data), 0);

recv() 本身是否提供任何防止缓冲区溢出的保护?例如,如果我将 recv() 的第三个参数更改为高于 recv_data 指向的缓冲区的值(例如 4000)——这会导致缓冲区溢出吗? (我实际上已经尝试过这样做,但似乎无法触发段错误)。

我实际上是在尝试创建一个有意易受攻击的服务器程序以更好地理解这些问题,这就是我尝试通过 recv() 溢出的原因。

修改:

不无关系,会找出为什么上面的 client.c 会发送超过 strlen(send_data) 指定的 1024 字节.我正在使用 gets(send_data) 从标准输入填充该缓冲区,但如果我通过标准输入输入超过 1024 字节,server.c 程序会显示它收到所有字节! :). send()strlen(send_data) 是否不限制发送的字节数?

最佳答案

For instance if I changed the 3rd argument to recv() to something higher than the buffer pointed to by recv_data (e.g. 4000) - would this cause a buffer overflow?

当然可以。如果网络缓冲区有 4000 字节的数据,它会把它放在缓冲区中。关键是,recv 像任何其他接受缓冲区的 C API 一样,它的长度相信调用者将传递缓冲区的实际长度,如果调用者传递了不正确的长度,那么错误就出在调用者身上,它可能导致到未定义的行为。

在 C 中,当您将数组传递给函数时,被调用函数无法知道数组的大小。因此,所有 API 仅依赖于您提供的输入。

char recv_data[1024];

// Socket setup and so on ommited...

bytes_recieved = recv(connected, recv_data, 1024, 0);
recv_data[bytes_recieved] = '\0';

以上代码可能会以多种方式引起麻烦。在以下情况下会导致未定义的行为:
(a) 如果 recv 返回 -1,则您直接索引到 recv_data 缓冲区而不检查返回值
(b) 如果 recv 返回 1024,那么它又会导致越界访问,因为大小为 1024 的数组应该从 0 访问到 1023

关于c++ - `recv()` 会导致缓冲区溢出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15187359/

相关文章:

c++ - 如何计算这个长递归

c++ - 查询 std::binary_search()

c++ - MSVC 警告 4611 关于 setjmp w/POD 结构

c++ - 二维 vector

linux - SO_REUSEADDR 套接字选项在客户端有用吗?

c - 在 Linux 中递归计算目录的最快 C 代码(无文件)

c - 字节打印和写入

c - 使用互斥锁和 pthreads 的 C 中的 Reader Writer 程序

c - 如何杀死/结束/取消/加入套接字阻塞线程?

sockets - 原始套接字多播