假设一个 Linux 二进制 foobar
有两种不同的操作模式:
- 模式 A:一种行为良好的模式,其中使用系统调用
a
、b
和c
。 - 模式 B:一种出错模式,其中系统调用
a
、b
、c
和d
被使用。
系统调用 a
、b
和 c
是无害的,而系统调用 d
有潜在危险并可能导致不稳定到机器。
进一步假设应用程序运行两种模式中的哪一种是随机的:应用程序以模式 A 运行的概率为 95%,以模式 B 运行的概率为 5%。该应用程序没有源代码,因此无法修改,只能按原样运行。
我想确保应用程序无法执行系统调用d
。当执行系统调用 d
时,结果应该是 NOOP 或应用程序的立即终止。
我如何在 Linux 环境中实现它?
最佳答案
应用程序是静态链接的吗?
如果不是,你可以覆盖一些符号,例如,让我们重新定义socket
:
int socket(int domain, int type, int protocol)
{
write(1,"Error\n",6);
return -1;
}
然后构建一个共享库:
gcc -fPIC -shared test.c -o libtest.so
让我们运行:
nc -l -p 6000
好的。
现在:
$ LD_PRELOAD=./libtest.so nc -l -p 6000
Error
Can't get socket
当您使用变量 LD_PRELOAD=./libtest.so
运行时会发生什么?它用 libtest.so 中定义的符号覆盖 C 库中定义的符号。
关于linux - 限制 Linux 应用程序的系统调用访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2146059/