在某些操作系统中,对于任何进程都有一个堆栈和一个堆。它们彼此相互增长。它们之间必须有一个保护带来检查重叠。任何人都可以给我一些关于它的插图。我想要编写我自己的函数来检查堆栈溢出错误。
答案 0 :(得分:3)
在这样的系统中,你通常会在堆顶部有一个保护词或类似的东西,比如0xa55a
或0xdeadbeef
。
然后,定期检查该保护字是否已损坏。如果是这样的话就会覆盖内存。
现在这可能不是必然是堆栈溢出,它可能是一个流氓内存写入。但是,在这两种情况下,某些事情都是严重错误的,所以你也可以同样对待它们。
当然,更现代的操作系统可能会采用硬件协助的方法,例如英特尔芯片。在那些中,您可以将堆栈段设置为特定大小,如果您尝试在那里写入(使用堆栈选择器),您将获得一个陷阱。
在这种情况下,堆将使用不同的选择器,以便保持独立。
答案 1 :(得分:1)
许多操作系统在堆栈和堆之间放置一个保护页面(或类似的技术)来防止这种攻击向量。我还没有看过canaries(paxdiablo提到的方法),它们主要用于防止堆栈内部溢出(也就是保护返回地址)。
Windows上的警卫页面:http://msdn.microsoft.com/en-us/library/aa366549(VS.85).aspx
不久前,基于这个问题,Linux有一个有趣的漏洞:http://www.h-online.com/open/news/item/Root-privileges-through-Linux-kernel-bug-Update-1061563.html