我从Google上了解到,它被用于控制应用程序级别的缓冲区溢出,并由CRT调用。同时还说:
"实质上,在进入受溢出保护的函数时,Cookie被放在堆栈中,在退出时,堆栈上的值与全局Cookie进行比较。任何差异都表示发生了缓冲区溢出,并导致立即终止程序。"
但是我并不是很理解它是如何工作的,请帮忙。
我从Google上了解到,它被用于控制应用程序级别的缓冲区溢出,并由CRT调用。同时还说:
"实质上,在进入受溢出保护的函数时,Cookie被放在堆栈中,在退出时,堆栈上的值与全局Cookie进行比较。任何差异都表示发生了缓冲区溢出,并导致立即终止程序。"
但是我并不是很理解它是如何工作的,请帮忙。
"Cookie"基本上就是一个任意的值。
所以,基本思路是在调用函数之前将所选的值写入堆栈。尽管它可能不是很好的值,让我们随意选择0x12345678作为该值。
然后调用该函数。
当函数返回时,它回到堆栈上的正确位置,并将该值与0x12345678进行比较。如果该值已更改,则表明被调用的函数已经写入了允许它写入的堆栈区域外部,因此它(以及该进程一般)被视为不可信,并关闭。
在这种情况下,系统选择不同的值,例如每次启动系统时都选择不同的值。这意味着可能不太可能偶然命中正确的值——它可能会偶然命中一次,但如果它正在那里写入特定的值,则当正确/选择的值更改时,它将最终写入错误的值,并检测到问题。
也值得注意的是,这个基本思想并不是特别新颖。例如,在MS-DOS时代,Borland和Microsoft的编译器都会在调用程序中的main
之前在堆栈底部写入一些已知的值。在main
返回后,它们会重新检查该值。如果该值与预期不符,则它将打印出错误消息(正好在程序退出时)。
这正是解释所说的,但你可以用“某个值”代替“cookie”。当函数被调用时,它会将某个值放入堆栈中。当函数返回时,它再次检查它,以查看是否更改了。
函数的正常行为是不触及内存位置。如果那里的值改变了,这意味着函数代码以某种方式覆盖了它,这意味着发生了缓冲区溢出。