c - GCC 如何阻止程序内的系统调用?

标签 c gcc system-calls

有人能告诉我如何阻止程序中的某些特定系统调用吗?我正在构建一个系统,它采用一段 C 源代码,用 gcc 编译并运行它。出于安全原因,我需要防止编译后的程序调用一些系统调用。有没有办法做到这一点,从源代码级别(例如剥离 gcc 的头文件,检测恶意外部调用,...)到可执行级别?

已编辑 #1: 添加有关恶意调用的详细信息。

编辑 #2: 我的系统是 GNU/Linux 系统。

编辑 #3:

我在几天内尝试了一些方法,以下是我目前得出的结论:

  1. 扫描源代码并不能解决主要问题,因为人们总是可以很好地混淆他/她的 C 源文件。
  2. “覆盖 C 符号”对库很有效,但对于系统调用我还没有达到我想要的效果。这个想法并没有死,但是,这样做肯定会让我花费很多时间进行黑客攻击(gcc 和/或 ld)。
  3. 权限降级就像一个魅力。我可以使用 fakeroot 或“访客”用户来执行此操作。这种方法也是最容易实现的。

另一个是native client我还没有尝试过,但由于项目和我的工作之间的共同点,我肯定会在不久的将来尝试。

最佳答案

正如其他人所指出的,程序不可能避免进行系统调用,它们遍布整个 C 库。

然而,如果您的平台支持它(例如 Linux),您可以通过谨慎使用 LD_PRELOAD 机制取得一些进展:您编写一个共享库,其符号名称与 C 库中的符号名称相同,称为而不是预期的 libc 函数。 (例如,Electric Fence 在基于 Debian 的系统上构建为共享库,并拦截对 mallocfree 等的调用)

我怀疑您可以使用此机制来捕获或检查对您不喜欢的任何 libc 函数的调用,并可能记录您认为无条件安全的那些函数。然后扫描已编译的可执行文件以查找与 INT 0x80 对应的代码,以捕获任何进行原始系统调用的尝试(0xcd 0x80 - 尽管要注意误报)可能是合理的.然而,我只是想了一会儿,我很容易错过一些东西,或者这可能是不切实际的......

关于c - GCC 如何阻止程序内的系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2948448/

相关文章:

c - 将 system() 的标准输出通过管道传输到其他 system() 的标准输入

c - 与结构相关的语法斗争

C - 实现将许多元素快速推送到数组末尾

C 包含路径 : Safe to use hyphen & underscore?

c - O1和Os有什么区别?

c - `read()` C中的系统调用不读取字节

c++ - 捕获调用堆栈并让它在不同的线程中执行

c++ - 双 10 小数点精度

c - 通过 MacPorts 安装 gcc45 后,如何使用它在我的 Mac 上构建 C 语言?

c - 为什么我在跟踪 write() 时得到的结果与其他人不同?