【问题标题】:GCC is calling __fn_chk for gets and puts, how can I call the unsafe functions directly?GCC 为获取和放置调用 __fn_chk,如何直接调用不安全函数?
【发布时间】:2018-11-07 00:02:45
【问题描述】:

尽管调用了 getsprintf,但似乎 GCC 正在调度

call sym.imp.__gets_chk
call sym.imp.__printf_chk

我有另一个给我的二进制文件——我没有编译它。它也再次链接/lib/i386-linux-gnu/libc.so.6 并直接调用函数。如何在不链接 _chk 符号的情况下直接链接这些函数?

我尝试过使用和不使用-fno-chkp-use-wrappers


当前的构建选项是

-m32 -fno-stack-protector -std=c89 -fno-PIE -no-pie -Os -mpreferred-stack-boundary=2 -fno-chkp-use-wrappers

【问题讨论】:

    标签: ubuntu gcc debian glibc


    【解决方案1】:

    感谢Employed Russian的帮助我找到了解决办法,我补充了

    -D_FORTIFY_SOURCE=0
    

    我对 GCC 的选择。事实证明,这仅在您使用 -O 时启用。就我而言,我使用的是 -Os 并启用了它!

    【讨论】:

      【解决方案2】:

      如何在不链接 _chk 符号的情况下直接链接这些函数?

      你不能:你必须在没有-fstack-protector的情况下重新编译这段代码。

      我明确有 -fno-stack-protector

      嗯,something 在你的环境中定义了__USE_FORTIFY_LEVEL > 0

      您可以使用以下方法预处理您的源代码:

      gcc -m32 -fno-stack-protector -std=c89 -fno-chkp-use-wrappers -dD -E stack0.c
      

      并验证__USE_FORTIFY_LEVEL 确实已定义,并找出它的来源。

      【讨论】:

      • 我明确拥有-fno-stack-protector,但我仍在使用这些功能
      • 这不是 Windows DLL 调用,而是我尝试在 Ubuntu 上使用上述问题中的选项编译 github.com/hellosputnik/exploit-exercises/blob/master/Protostar/…。你在sym.imp.__gets_chk 看到的就是radare2 是如何反汇编它的。符号是__gets_chkimp“标志空间”中。
      • 我有#define __USE_FORTIFY_LEVEL 0 会触发这个吗?我怎么知道它来自哪里?这是在真实的 .h 文件中编译的还是从真实的 .h 文件编译的?
      • 我在/usr/include/features.h看到了,但是好像设置为0,好像没有责任?
      • 当我运行提供的命令时。 gcc -m32 -fno-stack-protector -std=c89 -fno-chkp-use-wrappers -dD -E stack0.c 根本没有提到 chk 函数?海湾合作委员会正在这样做吗?还是 GCC 调用的链接器这样做?
      猜你喜欢
      • 2014-03-19
      • 2021-05-07
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2011-01-12
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多