我刚开始研究系统级别的安全性和挑战,特别是对于 C/C++ 和 Objective-C 等低级语言。我已经了解缓冲区溢出及其工作原理。我在 OS X 和 Ubuntu 上玩弄它。当然,这些系统实现了 ASLR 和堆栈保护,我们可以在编译时禁用它们。所以我对此有几个问题:
编译器如何在编译时检测溢出?我知道在编译时它会添加一个金丝雀,如果有任何指令试图覆盖它,它会抛出一个错误。但具体的算法是什么?如果有人可以为此指出 gcc 代码功能,那就太好了。
禁用堆栈保护并使堆栈/堆在 Ubuntu 上可执行就足够了吗?或者 ASLR 仍然可以使其难以被利用吗?
如果我有一个二进制文件(没有源代码)并且我知道它由于缓冲区溢出而崩溃,我该如何检测它?