我正在尝试了解代码漏洞,并正在测试我编写的一些简单程序。然而,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的信息,但我还没有到达任何地方。因此,我将非常感谢任何帮助。感谢。
答案 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 new
和operator delete
,但这对使用malloc
和free
的程序没有帮助。当然,您也可以编写自己的实现,但在某些操作系统上重载C库函数可能会有点挑战。
概念上,双重免费和free (unallocated_pointer)
之间的区别是什么?
答案 2 :(得分:-1)
您至少应该能够使用
关闭堆栈保护-fno-stack-protector
在编译时
编辑:对不起,刚看到这对你来说还不够
似乎并不容易,因为glibc对于所有程序都是全局的,所以如果你可以关闭保护就会非常糟糕。 我的建议是安装一个没有堆保护的旧Linux发行版(2003年中期或之前应该可以工作)。