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)
注意:我刚刚意识到您的问题标题似乎放错了位置 - 您收到的警告来自 macOS 关于执行使用gets(). 与使用GCC编译无关。
:-/无论如何,我让我的答案活着以供参考。
\n正如评论:我在谷歌上搜索了一些关于您正在寻找的内容,但在执行程序时似乎没有可靠的方法来禁用此警告。有人建议/usr/lib/libSystem.B.dylib在没有任何结果或经验的情况下重建,如果确实有效的话,但我个人认为这有点过于极端,甚至可能是有害的。- 我不推荐这种技术。
如果您确实想创建一个漏洞利用程序,请尝试gets()通过定制的函数进行重建,并将该函数命名为有点不同,例如 fe gets_c()。这应该是从 macOS 禁用此警告的解决方法。
旧答案(关于 GCC 本身):
\n首先,您似乎正在使用 C99 或 C89/C90 兼容的编译器,或者使用std=c99或std=c89/std=c90选项进行编译,因为只有符合 C11 之前标准的编译器才会发出关于gets()被弃用的警告。
ISO/IEC 删除了gets()C11 中的该功能。gets()如果您使用 C11 或更新的符合标准的编译器进行编译,则会收到有关在代码中使用它时的隐式声明的错误:
\n\n“错误:函数的隐式声明
\n\'gets\';您的意思是\'fgets\'?[-Werror=implicit-function-declaration] ”
如果要在编译时抑制警告,请-Wno-deprecated-declarations在编译时使用选项来禁用对已弃用声明的诊断。
来自 GCC 在线文档:
\n\n\n-Wno-deprecated-声明
\n不要对使用 deprecated 属性标记为已弃用的函数、变量和类型发出警告。(请参阅函数属性、变量属性、类型属性。)
\n来源:https ://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html
\n
如果您想在代码中嵌入对警告的抑制,请使用 David\xc2\xb4s 删除的答案中使用的方法来实现-Wno-deprecated-declarations抑制#pragma:
char str[256];\n\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored "-Wdeprecated-declarations"\n gets(str);\n#pragma GCC diagnostic pop\nRun Code Online (Sandbox Code Playgroud)\n