如何禁用 GCC 中有关使用已弃用的获取的警告?

wil*_*ill 3 c gcc exploit gets gcc-warning

我正在运行一个 CTF,目前正在编写一个利用 Cgets函数的问题。我知道该函数已被弃用且危险,我绝不会在任何其他情况下使用它。不幸的是,gcc编译我的代码,当我在函数被调用时运行二进制文件时gets,我收到一条友好的错误消息:

warning: this program uses gets(), which is unsafe.
Run Code Online (Sandbox Code Playgroud)

这通常会很好,因为它会警告您 gets 是不安全的,但不幸的是,在我的 CTF 中,我认为这个错误消息使问题变得有点太简单了。你知道我将如何禁用此警告吗?谢谢!

warning: this program uses gets(), which is unsafe.
Run Code Online (Sandbox Code Playgroud)

Rob*_*rtS 8

注意:我刚刚意识到您的问题标题似乎放错了位置 - 您收到的警告来自 macOS 关于执行使用gets(). 与使用GCC编译无关。

\n

:-/无论如何,我让我的答案活着以供参考。

\n

正如评论:我在谷歌上搜索了一些关于您正在寻找的内容,但在执行程序时似乎没有可靠的方法来禁用此警告。有人建议/usr/lib/libSystem.B.dylib在没有任何结果或经验的情况下重建,如果确实有效的话,但我个人认为这有点过于极端,甚至可能是有害的。- 我不推荐这种技术。

\n

如果您确实想创建一个漏洞利用程序,请尝试gets()通过定制的函数进行重建,并将该函数命名为有点不同,例如 fe gets_c()。这应该是从 macOS 禁用此警告的解决方法。

\n
\n

旧答案(关于 GCC 本身):

\n

首先,您似乎正在使用 C99 或 C89/C90 兼容的编译器,或者使用std=c99std=c89/std=c90选项进行编译,因为只有符合 C11 之前标准的编译器才会发出关于gets()被弃用的警告。

\n

ISO/IEC 删除了gets()C11 中的该功能。gets()如果您使用 C11 或更新的符合标准的编译器进行编译,则会收到有关在代码中使用它时的隐式声明的错误:

\n
\n

错误:函数的隐式声明\'gets\';您的意思是\'fgets\'?[ -Werror=implicit-function-declaration]

\n
\n
\n

如果要在编译时抑制警告,请-Wno-deprecated-declarations在编译时使用选项来禁用对已弃用声明的诊断。

\n

来自 GCC 在线文档:

\n
\n

-Wno-deprecated-声明

\n

不要对使用 deprecated 属性标记为已弃用的函数、变量和类型发出警告。(请参阅函数属性、变量属性、类型属性。)

\n

来源:https ://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html

\n
\n

如果您想在代码中嵌入对警告的抑制,请使用 David\xc2\xb4s 删除的答案中使用的方法来实现-Wno-deprecated-declarations抑制#pragma

\n
   char str[256];\n\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored "-Wdeprecated-declarations"\n    gets(str);\n#pragma GCC diagnostic pop\n
Run Code Online (Sandbox Code Playgroud)\n

  • 很好的答案,已编辑,因为我的答案不再有帮助 (2认同)