我有一个 C\C++ 代码,它通过网络接收以下形式的结构:

struct DataStruct
{
int DataLen;
BYTE* Data;
}

我运行过的代码 Data 在一个循环中 DataLen 时间并处理数据。

...问题:

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

所以,问题是 - 我如何验证收到的真实长度 Data?不改变结构可以吗?

提前致谢。

有帮助吗?

解决方案

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

当数据从网络接收,网络IO报告的字节数实际写入缓冲区,不管你使用read(2)recv(2),或boost::asio::async_read或其他任何我见过。当有一个“字节数遵循”字段中的数据结构的首部典型的用例,是重复调用read / recv的/等,直到收到很多字节(或直到发生了错误),才把它应该构建并返回您DataStruct(或报告错误)。

其他提示

您知道你有多少字节接收,所以只用DataLen进行比较。

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

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

一些保护机制是:

  • 尝试 realloc() 缓冲区,在一些可接受的大小内(如果 Data 是动态的)
  • 例外情况 朋友们:使用 SIGSEGVsignal(2), signal(7)setjmp(2) 做一些有用的事 试着抓 代码结构。看 组合 setjmp()/longjmp() 和信号处理 有关此主题的快速介绍。使用 sigaction(2) 更深入(通过获取错误的地址;)。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top