【问题标题】:How to turn off Glibc run-time protections?如何关闭 Glibc 运行时保护?
【发布时间】:2011-10-08 17:06:04
【问题描述】:

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

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

我也知道您可以使用 -w 标志关闭编译时警告,但这似乎也不是我想要的。我尝试过阅读 GCC 标志并查找有关 Glibc 的信息,但我还没有得到任何结果。因此,我将不胜感激任何帮助。谢谢。

【问题讨论】:

    标签: c++ security testing gcc glibc


    【解决方案1】:

    查看 malloc(3) 的手册页以了解 MALLOC_CHECK_ 环境变量的用法。使用它,您可以为那些双重免费错误以及不玩的东西关闭“中止”。

    man malloc
    

    因此,如果您的程序被称为“badfree”,您可以使用导出命令设置 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)
    

    【讨论】:

    • 无论如何要在运行时进行?我的意思是,没有环境变量、函数或 C 定义。
    • 是的! man 3 mallopt,虽然您可能需要安装开发手册页或其他任何东西,但通常不是默认安装。 mallopt(M_CHECK_ACTION,0);将完全关闭检查(如 MALLOC_CHECK_=0 作为 env var)。正如预期的那样,在 malloc.h 中定义。
    【解决方案2】:

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

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

    【讨论】:

    • 也许我还没有关注,但是重载 new/delete 对我有什么帮助?我想我忘了明确指出这一点,但是在我编写 C 代码时会出现 Double Free。
    • 我猜你忘了提这个!您还忘了提及您的意图:您是在尝试编写工具来检测漏洞,还是在尝试编写漏洞?
    • 在许多机器上,有 no 选项可以让您使用编译器执行操作,因为 C 标准库不是编译器的一部分。相反,标准库是系统的一部分。例如,它与 Linux 和 Mac OSX 上的系统捆绑在一起。 GNU 编译器收集依赖于此。标准库不是 gcc 的一部分。
    • 哦,我明白了。我希望我能找回那些在谷歌上搜索/盯着编译器选项的时间......无论如何,是的,我只是在尝试不同的弱点,看看内存会发生什么,我可以用它们做什么,等等。
    • 更正我之前的评论:这是 GNU 编译器集合,而不是 GNU 编译器集合。
    【解决方案3】:

    您至少应该能够关闭堆栈保护

    -fno-stack-protector
    

    在编译时

    编辑:抱歉,刚刚发现这对你来说还不够

    似乎并不容易,因为 glibc 对所有程序都是全局的,所以如果你可以关闭保护,那就太糟糕了。 我的建议是安装一个没有堆保护的旧 linux 发行版(2003 年中期或更早的版本应该可以使用)。

    【讨论】:

    • 我一直在到处搜索,但找不到任何东西。我发现的唯一其他标志是 FORTIFY_SOURCE,但这也对我没有帮助。安装一个真正旧版本的 gcc 会起作用,还是你真的必须做整个发行版?
    • 我认为因为 glibc 是您的发行版的核心部分,所以安装旧版本的 gcc 是不够的。但是使用 VirtualBox 或类似的东西,甚至安装整个发行版都非常轻松。
    • “黑客。剥削的艺术”一书。例如,Jon Erickson 包含一个没有保护机制的 linux 发行版来尝试不同的黑客攻击。我将它安装在 VirtualBox 中,它的启动速度非常快。
    • 哦,好的。我其实有这本书(但还没打开哈哈),所以我会在那个环境下尝试代码,看看我是否仍然得到错误。
    • 更新:我刚刚尝试在 Hacking linux 环境中进行双重释放,但 glibc 仍然立即中止程序。
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2017-04-25
    • 2018-02-19
    • 2013-06-25
    • 2012-07-31
    相关资源
    最近更新 更多