PTRACE_SYSCALL和orig_eax

时间:2012-02-05 13:29:02

标签: c++ linux system-calls ptrace

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

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

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

1 个答案:

答案 0 :(得分:3)

我有一次类似的问题(见my question on the topic)。当程序启动时,它会在调用main()之前初始化应用程序(例如加载共享库)时执行大量系统调用。我所做的是简单地允许更多的系统调用并使用其他安全手段(例如chroot)来阻止应用程序访问不需要的文件。

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

找到入口点后,还有另一种限制程序进行某些系统调用的方法。不是使用PTRACE_SYSCALL来检查程序完成的每个系统调用,而是向程序注入prctl(PR_SET_SECCOMP, ...)调用(使用ptrace()),然后让程序继续运行。