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

Bhu*_*ant 12 c++ window startup crt msvcrt

我从谷歌那里读到,它用于控制应用程序级别的缓冲区溢出,并由CRT调用.它也说

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

但是我无法理解它是如何工作的?请帮忙.

Jer*_*fin 27

"cookie"基本上只是一个任意值.

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

然后它调用该函数.

当函数返回时,它返回到堆栈上的正确位置,并将该值与0x12345678进行比较.如果值已更改,则表示被调用的函数在允许写入的堆栈区域之外写入,因此它(以及通常的该过程)被认为是不值得信任的,并且关闭.

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

值得注意的是,这个基本想法并不是特别新颖.例如,在MS-DOS时代,Borland和微软的编译器会在调用main你的程序之前在堆栈的最底部写一些已知值.之后main回来,他们会再次检查该值.然后,如果值与预期的值不匹配,它将打印出错误消息(正如程序退出的那样).


zne*_*eak 8

这正是解释所说的,但你可以用"某些价值"取代"cookie".调用该函数时,它会在堆栈上放置一些值.当函数返回时,它会再次检查它以查看它是否发生了变化.

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