在攻击情形中使用无效输入传递时处理memcpy段错误

时间:2012-06-18 07:15:19

标签: c segmentation-fault memcpy

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

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

read_buffer(something, length of buffer read, buffer contents);

read_buffer函数使用memcpy将第二个参数中指定长度的缓冲区复制到另一个位置

在客户端,完成以下操作:

write_buffer(something, length of buffer, buffer contents);

问题是如果我们发送一个无效的长度参数(与第三个参数中复制的实际长度不匹配),从客户端,memcpy位置的服务器端有一个段错误

我不确定如何输入 - 验证传递给memcpy函数的参数

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以在缓冲区的开头附加缓冲区的长度 -------------------------------------------------- -----------
|缓冲区的固定长度 - n个字节| BUFFER
-------------------------------------------------- -----------

现在每次在服务器端读取它时,首先读取包含长度的“n”字节(保留用于存储长度)。数据到达后,您可以将length of bufferfirst n bytes进行比较以进行验证。 希望这会有所帮助。