17

我从谷歌读到它用于控制应用程序级别的缓冲区溢出,它由 CRT 调用。它还说

" 本质上,在进入受溢出保护的函数时,cookie 被放入堆栈,而在退出时,堆栈上的值与全局 cookie 进行比较。它们之间的任何差异都表明发生了缓冲区溢出并导致立即终止该计划。”

但我不太明白它是如何工作的?请帮忙。

4

2 回答 2

34

“cookie”基本上只是一个任意值。

因此,基本思想是在调用函数之前将所选值写入堆栈。虽然它可能不是一个很好的值,但让我们随意选择 0x12345678 作为值。

然后它调用该函数。

当函数返回时,它会回到堆栈上的正确位置,并将该值与 0x12345678 进行比较。如果值发生了变化,这表明被调用的函数写在允许它写的堆栈区域之外,所以它(以及一般的进程)被认为是不可信的,并被关闭。

在这种情况下,系统不会选择 0x12345678,而是定期选择不同的值,例如每次启动系统时。这意味着它不太可能意外地达到正确的值——它可能碰巧这样做一次,但如果它在那里写入一个特定的值,当正确/选择的值发生变化时,它最终会写入错误的值,并且问题将被检测到。

可能还值得注意的是,这个基本想法并不是特别新。main举例来说,在 MS-DOS 时代,Borland 和 Microsoft 的编译器都会在调用您的程序之前在堆栈的最底部写入一些已知值。返回后main,他们会重新检查该值。如果该值与预期的不匹配,它将打印出一条错误消息(在程序退出时)。

于 2013-11-13T04:49:34.190 回答
9

这正是解释所说的,但是您可以将“cookie”替换为“some value”。当函数被调用时,它会在堆栈上放置一些值。当函数返回时,它会再次检查它是否已更改。

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

于 2013-11-13T04:48:13.323 回答