如何关闭Glibc运行时保护?

时间:2011-07-19 16:44:31

标签: c++ security testing gcc glibc

我正在尝试了解代码漏洞,并正在测试我编写的一些简单程序。然而,Glibc在运行时捕获的许多问题(例如Stack-Smashing,Double Free等)。因此,我希望能够在没有Glibc运行时检测错误的情况下运行我的程序。有没有办法关闭Glibc的检测? (比如编译器标志等)。

我在之前的链接中看到它描述了如何关闭ASLR和Canaries,但这不是我想要做的,因为它仍然会阻止像Double Free和其他一些堆错误我想尝试的错误out(http://stackoverflow.com/questions/2340259/how-to-turn-off-gcc-compiler-optimization-to-enable-buffer-overflow)。

我也知道你可以用-w标志来关闭编译时警告,但这似乎也不是我想要的。我已经尝试阅读GCC标志并查找有关Glibc的信息,但我还没有到达任何地方。因此,我将非常感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:25)

检查malloc(3)的手册页以了解MALLOC_CHECK_环境变量的用法。使用此功能,您可以关闭那些双重免费错误的“中止”以及无法使用的内容。

man malloc

因此,如果您的程序被称为'badfree',您可以使用export命令设置MALLOC_CHECK_(注意尾随下划线),或者只在每次执行badfree时设置它。

export MALLOC_CHECK_=0
./badfree

- 或 -

MALLOC_CHECK_=0 ./badfree

请记住,如果您使用第一种方法,则会为您在该shell中运行的任何程序设置。

malloc(3)手册页中的MALLOC_CHECK_设置为:

MALLOC_CHECK_ =
 0  Silently ignore any issues
 1  Send error message to stderr
 2  abort() is called immediately, killing your program.
 3  Do both '1' and '2' (MALLOC_CHECK_ is a bitfield)

答案 1 :(得分:0)

您可以重载operator newoperator delete,但这对使用mallocfree的程序没有帮助。当然,您也可以编写自己的实现,但在某些操作系统上重载C库函数可能会有点挑战。

概念上,双重免费和free (unallocated_pointer)之间的区别是什么?

答案 2 :(得分:-1)

您至少应该能够使用

关闭堆栈保护
-fno-stack-protector

在编译时

编辑:对不起,刚看到这对你来说还不够

似乎并不容易,因为glibc对于所有程序都是全局的,所以如果你可以关闭保护就会非常糟糕。 我的建议是安装一个没有堆保护的旧Linux发行版(2003年中期或之前应该可以工作)。