C++中的安全cookie是什么?

23

我从Google上了解到,它被用于控制应用程序级别的缓冲区溢出,并由CRT调用。同时还说:

"实质上,在进入受溢出保护的函数时,Cookie被放在堆栈中,在退出时,堆栈上的值与全局Cookie进行比较。任何差异都表示发生了缓冲区溢出,并导致立即终止程序。"

但是我并不是很理解它是如何工作的,请帮忙。


3
据我所知,它只是一些数据,在正常代码中不太可能出现,可以在函数退出时与之比较,以确定是否发生了覆写。类似的保护机制通常也会放置在动态分配的内存块开头和结尾,以检查是否发生了溢写或欠写。 - Retired Ninja
2个回答

41

"Cookie"基本上就是一个任意的值。

所以,基本思路是在调用函数之前将所选的值写入堆栈。尽管它可能不是很好的值,让我们随意选择0x12345678作为该值。

然后调用该函数。

当函数返回时,它回到堆栈上的正确位置,并将该值与0x12345678进行比较。如果该值已更改,则表明被调用的函数已经写入了允许它写入的堆栈区域外部,因此它(以及该进程一般)被视为不可信,并关闭。

在这种情况下,系统选择不同的值,例如每次启动系统时都选择不同的值。这意味着可能不太可能偶然命中正确的值——它可能会偶然命中一次,但如果它正在那里写入特定的值,则当正确/选择的值更改时,它将最终写入错误的值,并检测到问题。

也值得注意的是,这个基本思想并不是特别新颖。例如,在MS-DOS时代,Borland和Microsoft的编译器都会在调用程序中的main之前在堆栈底部写入一些已知的值。在main返回后,它们会重新检查该值。如果该值与预期不符,则它将打印出错误消息(正好在程序退出时)。


12

这正是解释所说的,但你可以用“某个值”代替“cookie”。当函数被调用时,它会将某个值放入堆栈中。当函数返回时,它再次检查它,以查看是否更改了。

函数的正常行为是不触及内存位置。如果那里的值改变了,这意味着函数代码以某种方式覆盖了它,这意味着发生了缓冲区溢出。


现在对我来说非常清楚了,你的第一行解释得很好。谢谢Zneak。 - Bhupesh Pant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接