我想用 gcc 和 glibc(或任何其他 c 库)编译 C 程序 但我想限制程序访问某些功能 例如,如果程序使用套接字或信号处理函数,则不应编译。
知道我该怎么做吗?
顺便说一句,我想在一个简单的编程竞赛评委身上使用它
谢谢
最佳答案
您无法可靠限制对某些功能的访问,因为积极主动的开发人员总是找到解决方法。例如,他可以使用 dlsym 在运行时查找某些函数的地址,或者使用 asm 代码调用某些系统调用(或使用缓冲区溢出技术)或假设特定版本libc
二进制文件并计算一些函数指针(例如,通过使用内置偏移量偏移某些合法 libc
函数(如 printf
)的地址) ,或将一些文字字符串(包含合适的机器操作码)转换为函数指针等,等等......
但是,您可能会考虑自定义编译器(例如,如果使用最近的 GCC 进行编译,请使用 MELT 扩展对其进行自定义)以检测常见情况(但不是全部)。这可能意味着开发此类编译器定制需要花费数周的时间。
您还可以链接到特制的 libc
、使用 LD_PRELOAD
或 ptrace
等。
要可靠地禁止某些行为,您应该在某个虚拟容器内运行。
PS。 Statically (可靠且可靠)检测到某些源代码永远不会调用给定的一组函数是 undecidable ,因为相当于 halting problem .关于编译具有有限库访问权限的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27731599/