在攻击场景中使用无效输入传递memcpy segfaults时处理memcpy segfaults

在攻击场景中使用无效输入传递memcpy segfaults时处理memcpy segfaults,c,segmentation-fault,memcpy,C,Segmentation Fault,Memcpy,我在这里用一个守护进程(用linux编写)测试一个小问题。我想知道所做的是否正确 守护进程使用dlopen调用加载共享对象文件(.so)。共享对象通过网络从客户端接收一些缓冲区。它使用以下调用读取缓冲区: read_buffer(something, length of buffer read, buffer contents); read_buffer函数使用memcpy将第二个参数中指定长度的缓冲区复制到另一个位置 在客户端,执行以下操作: write_buffer(something,

我在这里用一个守护进程(用linux编写)测试一个小问题。我想知道所做的是否正确

守护进程使用dlopen调用加载共享对象文件(.so)。共享对象通过网络从客户端接收一些缓冲区。它使用以下调用读取缓冲区:

read_buffer(something, length of buffer read, buffer contents);
read_buffer函数使用memcpy将第二个参数中指定长度的缓冲区复制到另一个位置

在客户端,执行以下操作:

write_buffer(something, length of buffer, buffer contents);
问题是,如果我们从客户端发送一个无效的长度参数(与第三个参数中复制的长度不匹配),那么服务器端的memcpy位置就会出现segfault

我不知道如何输入并验证传递给memcpy函数的参数


请您帮助我了解可能的解决方案

要检查C/C++代码中的内存分配/访问错误,请使用。服务器端无法(据我所知)确定传递的参数是否有效。这就是C/C++的信条:知道你在做什么,否则你会死。没有安全网。

要检查C/C++代码在内存分配/访问中是否存在错误,请使用。服务器端无法(据我所知)确定传递的参数是否有效。这就是C/C++的信条:知道你在做什么,否则你会死。没有安全网。

您可以将缓冲区的长度附加到缓冲区的开头。
-------------------------------------------------------------
|缓冲区的固定长度-n字节|缓冲区
-------------------------------------------------------------

现在,每次在服务器端读取时,首先读取包含长度的“n”字节(保留用于存储长度)。当数据到达时,您可以比较缓冲区的
长度
前n个字节
,以进行验证。
希望这有帮助。

您可以将缓冲区的长度附加到缓冲区的开头。
-------------------------------------------------------------
|缓冲区的固定长度-n字节|缓冲区
-------------------------------------------------------------

现在,每次在服务器端读取时,首先读取包含长度的“n”字节(保留用于存储长度)。当数据到达时,您可以比较缓冲区的
长度
前n个字节
,以进行验证。
希望这有帮助。

当您传递无效长度时,它是什么?为什么它会失效?您是否尝试在调试器中单步检查代码以了解其无效的原因?1)不要传递无效的长度。2) 是否忽略read()和write()的返回值?3) 请发布一些真实的代码。当你传递一个无效的长度时,它是什么?为什么它会失效?您是否尝试在调试器中单步检查代码以了解其无效的原因?1)不要传递无效的长度。2) 是否忽略read()和write()的返回值?3) 请发布一些真实的代码。无效长度是由攻击脚本传递的,目的是使服务器崩溃。但是,在memcpy()初始化之前,您可以将“无效长度”与缓冲区大小进行比较,不是吗?@DeafEar您真的需要用这些新的、突然的信息编辑您的问题。如果这就是出现无效长度的原因,您可能需要使用加密等安全措施。很抱歉,我没有提到攻击场景。改变summary@wildplasser忘了提到它不是以null结尾的缓冲区。无效长度是由攻击脚本传递的,目的是使服务器崩溃。但在memcpy()初始化之前,您可以将“无效长度”与缓冲区大小进行比较,不是吗?@deafar您真的需要用这个新的,突发信息。如果这就是出现无效长度的原因,您可能需要使用加密等安全措施。很抱歉,我没有提到攻击场景。改变summary@wildplasser忘了提到它不是以null结尾的缓冲区。