我正在学习缓冲区溢出,我得到了胖指针的想法,但我不太明白它们是如何提供良好的保护的?如果您能够修改指针使其指向另一个地址,那么您是否无法修改胖指针的 obj 基址和 obj 结束部分以使指针看起来仍然有效?
胖指针如何提供良好的保护?
信息安全
缓冲区溢出
2021-09-05 22:11:43
2个回答
缓冲区溢出与将指针设置为指向另一个任意地址无关。
当输入导致您的程序执行看似正确的操作(例如“ increment()
:将指针向前移动 256 字节”)太多次时,就会发生缓冲区溢出,从而使指针移出预期的数据结构/数组,并进入另一个目的。
“胖指针”包含有关数据结构/数组大小的信息。这意味着increment()
可以在其代码中进行安全检查,以确保指针在适当的范围内。您仍然需要在代码中的某处进行安全检查,但这可以让您集中它。
您似乎想到了通常发生在堆上的缓冲区溢出类型。通常,分配的内存块作为元素存储在双向链表中,元数据包括指向下一个和前一个元素的指针。从理论上讲,通过溢出缓冲区,您可以覆盖下一个内存块的元数据,如果该内存块被释放,您可以覆盖函数指针,从而导致任意代码执行。有关剥削的更多信息,请参阅此网站
胖指针可以保护您免受此影响:通过简单地检查数组上的每个操作(例如读取或写入该位置),在内部进行边界检查,给定的偏移量/索引是否有效,并且当且仅当边界检查通过,操作将被执行。(就像@cloudfeet 已经说过的那样。)这意味着您将无法在内存边界之后写入,因此无法覆盖下一个内存块的元数据或堆栈上的指针等内容。
其它你可能感兴趣的问题