2

如果子进程执行读取和写入之外的其他系统调用(甚至过滤这些调用,但这是另一回事),我想杀死一个子进程,但默认情况下会执行一些系统调用。

我已经编译了一个空的测试子程序(立即退出),并且我还有一个父进程,它分叉、启用 ptracing 并执行子程序。父进程使用 PTRACE_SYSCALL 并且每次都检查 orig_eax。我的测试程序报告说孩子被停止了 49 次(我假设这意味着 48 / 2 + 1 系统调用)。

我想知道系统调用序列是否始终相同(初始化)和/或有可能知道我何时可以开始以及何时停止我父母的 kill-on-syscall?

4

1 回答 1

3

我曾经遇到过类似的问题(请参阅我关于该主题的问题)。程序启动时,在调用main(). 我所做的只是允许更多的系统调用并使用另一种安全手段(例如chroot)来防止应用程序访问不需要的文件。

更好的选择是以某种方式找到main()程序函数的入口点(请参阅本教程以编写调试代码)并在该点之后禁用系统调用。我不知道在一般情况下是否可以这样做,但这就是我开始搜索的方式。

找到入口点后,还有另一种方法可以限制程序进行某些系统调用。与其使用PTRACE_SYSCALL检查程序完成的每个系统调用,不如注入对程序的prctl(PR_SET_SECCOMP, ...)调用(使用ptrace()),然后让程序运行。

于 2012-11-27T13:46:09.937 回答