Jer*_*fin 27
"cookie"基本上只是一个任意值.
因此,基本思想是在调用函数之前在堆栈上写入所选的值.虽然它可能不是一个非常好的值,但让我们任意选择0x12345678作为值.
然后它调用该函数.
当函数返回时,它返回到堆栈上的正确位置,并将该值与0x12345678进行比较.如果值已更改,则表示被调用的函数在允许写入的堆栈区域之外写入,因此它(以及通常的该过程)被认为是不值得信任的,并且关闭.
在这种情况下,系统不是选择0x12345678,而是定期选择不同的值,例如每次启动系统时.这意味着它不太可能意外地达到正确的值 - 它可能偶尔会这样做,但是如果它在那里写了一个特定的值,当正确/选择的值改变时,它最终会写错了值,并且问题将被检测到.
值得注意的是,这个基本想法并不是特别新颖.例如,在MS-DOS时代,Borland和微软的编译器会在调用main你的程序之前在堆栈的最底部写一些已知值.之后main回来,他们会再次检查该值.然后,如果值与预期的值不匹配,它将打印出错误消息(正如程序退出的那样).
这正是解释所说的,但你可以用"某些价值"取代"cookie".调用该函数时,它会在堆栈上放置一些值.当函数返回时,它会再次检查它以查看它是否发生了变化.
该功能的正常行为是不触摸存储器位置.如果那里的值发生了变化,则意味着函数代码以某种方式覆盖了它,这意味着存在缓冲区溢出.
| 归档时间: |
|
| 查看次数: |
11098 次 |
| 最近记录: |