C ++:在编译之前可以将函数指针追溯到原始函数而不查看函数名吗?

时间:2016-07-28 14:17:16

标签: c++

我想设置一个服务器,学生可以上传和运行课程代码。但是,我不希望他们访问各种功能,例如system(),这可能会导致对我的服务器的错误访问。我可以在预处理器输出中搜索显式函数调用,但是如果用户创建了这样的函数指针:

int (*syst)(const char*) = system;
syst("rm *");

我仍然对威胁持开放态度。但是,我不能只搜索字符串" system",因为它是一个有效的名称 - 如果学生没有包含cstdlib,他们可以使用该名称作为变量名称。由于这是一个开始的编程课程,因此拥有一个十英里长的变量名称黑名单是一个坏主意。

有没有办法定义除名称以外的功能,并允许我在编译代码之前搜索其他名称?

2 个答案:

答案 0 :(得分:3)

到目前为止,最简单的解决方案是编译代码 - 这非常无害 - 然后查看实际的库导入。用户可能已定义了自己的system,但这不会导致从system导入glibc

Showing imported symbols

您无法查看原始源代码的主要原因是#define允许恶意用户隐藏列入黑名单的符号名称。但是还有很多其他的可能性,包括

auto hidden = &sys\
tem;

所以你需要对源进行一些处理,而且只需要完全处理整个源代码就可能是最简单的。

答案 1 :(得分:1)

我还建议作为非特权用户在chroot内运行。它比VM重量更轻。

唉,从指针中获取函数名是不可能的 How to get function's name from function's pointer in C?这个问题是从C的角度来看的,但基本上它也是同样的问题。