hex*_*ain 4 c c++ pascal system-calls
通过使用任何编译器参数或修改头文件/单元文件,有没有办法在 C/C++ 和 Pascal 中禁用system()和exec()运行?(这是一个窗口)
我试过使用-Dsystem=NONEXISTgcc 和 g++ 但#include <cstdio>导致编译错误。
编辑:当然我知道他们可以#undef system用来绕过防御,所以我试图注释掉systemstdlib.h 中的函数行,但这也不起作用。
EDIT2(评论):这是一个系统,用户提交他们的程序,服务器用不同的输入数据编译和运行它,然后将程序输出与预先计算的标准输出进行比较,看看程序是否正确。现在一些用户发送代码,比如system("shutdown -s -t 0");关闭服务器。
服务器运行的是Windows系统,所以我没有任何chroot环境。此外,服务器应用程序是封闭源代码的,因此我无法控制用户提交的程序的执行方式。我能做的是修改编译器命令行参数并修改头文件。
嗯,你可以试试:
#define system DontEvenThinkAboutUsingThisFunction
#define exec OrThisOneYouClown
Run Code Online (Sandbox Code Playgroud)
在头文件中,但我很确定任何称职的代码猴子都可以绕过这种“保护”。
我很想了解您为什么认为这是必要的(如果我们更好地理解问题,可能会有更好的解决方案)。
唯一想到的是您想提供一些类似于 Euler 项目的在线编译器/运行器。如果这是这种情况,那么你可以搜索代码的字符串system<whitespace>(作为一个选项,但是,即使是这样,确定当事人可能只是:
#define InoccuousFunction system
Run Code Online (Sandbox Code Playgroud)
绕过你的防御。
如果是这种情况,您可能需要考虑使用类似的东西,chroot这样没人甚至可以访问任何危险的二进制文件shutdown(并且该特定的野兽无论如何都不应该真正由普通用户运行) - 换句话说,限制他们的环境,这样他们甚至只能看到gcc它的同类。
您需要进行适当的沙箱处理,因为即使您以某种方式阻止他们运行外部程序,他们仍然可能会执行危险的操作,例如覆盖文件或打开与他们自己的盒子的套接字连接以发送您宝贵信息的内容。