加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在C和Pascal中禁用system()和exec()函数

发布时间:2020-12-16 09:38:11 所属栏目:百科 来源:网络整理
导读:有没有办法通过使用任何编译器参数或修改头/单元文件来禁用C/C++和Pascal中的system()和exec()函数? (这是一个 Windows) 我已经尝试将-Dsystem = NONEXIST用于gcc和g但#include cstdio导致编译错误. 编辑:当然我知道他们可以使用#undef系统绕过防御,所以我
有没有办法通过使用任何编译器参数或修改头/单元文件来禁用C/C++和Pascal中的system()和exec()函数? (这是一个 Windows)

我已经尝试将-Dsystem = NONEXIST用于gcc和g但#include< cstdio>导致编译错误.

编辑:当然我知道他们可以使用#undef系统绕过防御,所以我试图在stdlib.h中注释掉系统功能行,但这也行不通.

EDIT2(评论):这是一个系统,用户向其提交程序,服务器使用不同的输入数据编译和运行它,然后将程序输出与预先计算的标准输出进行比较,以查看程序是否正确.现在一些用户发送类似system的代码(“shutdown -s -t 0”);关闭服务器.

服务器正在运行Windows系统,因此我没有任何chroot环境.此外,服务器应用程序是封闭源代码,因此我无法控制用户提交的程序的执行方式.我能做的是修改编译器命令行参数并修改头文件.

解决方法

好吧,你可以尝试:

#define system DontEvenThinkAboutUsingThisFunction
#define exec   OrThisOneYouClown

在头文件中,但我很确定任何值得他们的盐的代码猴子可以绕过这样的“保护”.

我有兴趣理解为什么你认为这是必要的(如果我们更好地理解问题,可能会有更好的解决方案).

唯一想到的是你想要提供一些类似于Euler项目的在线编译器/运行器.如果是这种情况,那么你可以在代码中搜索字符串系统< whitespace>(作为一个选项,但即使这样,一个坚定的一方可能只是:

#define InoccuousFunction system

绕过你的防御.

如果是这种情况,你可能想要考虑使用像chroot这样的东西,这样任何人都无法访问任何危险的二进制文件,比如关机(并且特定的野兽不应该真正由普通用户运行) – 在换句话说,限制他们的环境,以便他们甚至可以看到的唯一的东西是gcc和它的亲属.

您需要进行适当的沙盒操作,因为即使您以某种方式阻止它们运行外部程序,它们仍然可以执行危险的操作,例如覆盖文件或打开套接字连接到自己的盒子以发送您的宝贵信息的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读