胖指针如何提供良好的保护?

信息安全 缓冲区溢出
2021-09-05 22:11:43

我正在学习缓冲区溢出,我得到了胖指针的想法,但我不太明白它们是如何提供良好的保护的?如果您能够修改指针使其指向另一个地址,那么您是否无法修改胖指针的 obj 基址和 obj 结束部分以使指针看起来仍然有效?

2个回答

缓冲区溢出与将指针设置为指向另一个任意地址无关。

当输入导致您的程序执行看似正确的操作(例如“ increment():将指针向前移动 256 字节”)太多次时,就会发生缓冲区溢出,从而使指针移出预期的数据结构/数组,并进入另一个目的。

“胖指针”包含有关数据结构/数组大小的信息。这意味着increment()可以在其代码中进行安全检查,以确保指针在适当的范围内。您仍然需要在代码中的某处进行安全检查,但这可以让您集中它。

您似乎想到了通常发生在堆上的缓冲区溢出类型。通常,分配的内存块作为元素存储在双向链表中,元数据包括指向下一个和前一个元素的指针。从理论上讲,通过溢出缓冲区,您可以覆盖下一个内存块的元数据,如果该内存块被释放,您可以覆盖函数指针,从而导致任意代码执行。有关剥削的更多信息,请参阅此网站

胖指针可以保护您免受此影响:通过简单地检查数组上的每个操作(例如读取或写入该位置),在内部进行边界检查,给定的偏移量/索引是否有效,并且当且仅当边界检查通过,操作将被执行。(就像@cloudfeet 已经说过的那样。)这意味着您将无法在内存边界之后写入,因此无法覆盖下一个内存块的元数据或堆栈上的指针等内容。