我正在观看有关缓冲区溢出的大学讲座,教授最后说了
即使我们能够使用漏洞利用代码填充缓冲区并跳转 进入该代码,我们仍然无法执行它..
他提到的原因是:
程序员避免使用导致溢出的函数。
随机堆栈偏移:在程序开始时,在堆栈上分配随机的空间量,以便难以预测插入代码的开头。
使用技术检测堆栈损坏。
非可执行代码段:仅允许代码从内存的“文本”部分执行。
现在我想知道,现在缓冲区溢出攻击是否仍然存在?或者它已经过时了。
详细解答将非常感谢!
答案 0 :(得分:8)
不是我们所有人。每天都有一群新的程序员。 strcpy
不好的集体知识是否神奇地传播给他们?我不这么认为。
困难,是的。不可能,没有。任何可以变成任意读取的漏洞都可以轻而易举地破坏这种保护。
在某些情况下,我们确实可以检测到堆栈损坏。例如, Canaries 可能会被覆盖,它们的值依赖于编译器,并且它们可能无法防止各种堆栈损坏(例如GCC的-fstack-protector-strong
可以防止EIP覆盖,但不会覆盖其他类型超支)
W ^ X内存已经成为现实,但有多少操作系统已经将它用于堆栈?这对你周末来说是一个有趣的小研究项目。 :)此外,如果你研究面向返回编程(ROP)技术(返回libc是它的一个应用程序),你会发现它也可以被绕过。