如何验证接收到的字节数组的长度,该数组不是以空值终止的?

时间:2010-08-31 12:23:10

标签: c++ pointers bytearray penetration-testing

我有一个C \ C ++代码,通过网络接收结构:

struct DataStruct
{
int DataLen;
BYTE* Data;
}

我在Data次循环中运行DataLen代码并处理数据。

......问题:

在代码来到安全专家进行渗透测试后,他们准备了一个假应用程序,该应用程序发送的结构DataLen大于Data的实际长度。当然,这会导致访问冲突异常。

所以,问题是 - 如何验证收到的Data的实际长度?是否有可能不改变结构?

提前致谢。

4 个答案:

答案 0 :(得分:4)

尼斯安全专家!我希望我的公司有这样的部门。

无论何时从网络接收数据,网络IO都会报告实际写入缓冲区的字节数,无论您使用read(2)recv(2)还是boost::asio::async_read还是其他任何我'见过。当数据结构的标题中存在“要遵循的字节数”字段时的典型用例是重复调用read / recv / etc,直到收到许多字节(或直到发生错误),然后才应构造它并返回您的DataStruct(或报告错误)。

答案 1 :(得分:2)

您知道收到了多少字节,因此只需将其与DataLen进行比较。

答案 2 :(得分:1)

不改变结构是不可能的。从TCP / IP套接字接收的数据是普通流。从逻辑上讲,它不分为数据包。物理分组可以包含一个或多个DataStruct实例,一个DataStruct实例可以分成两个或更多个物理分组。仅当没有通信错误或无效数据包时,才能使用当前信息结构。

答案 3 :(得分:0)

如果您没有任何内在限制,腐败很容易。

一些保护机制将是:

  • 尝试realloc()缓冲区,在可接受的大小范围内(如果Data是动态的)
  • 例外 好友:在SIGSEGVsignal(2)signal(7)中使用setjmp(2)做一些有用的 try / catch 代码结构。有关此主题的快速介绍,请参阅Combining setjmp()/longjmp() and Signal Handling。使用sigaction(2)更深入(通过获取错误的地址;)。