【问题标题】:PTRACE_SYSCALL and orig_eaxPTRACE_SYSCALL 和 orig_eax
【发布时间】:2012-02-27 07:25:00
【问题描述】:

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

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

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

【问题讨论】:

  • 我无法清楚地理解您所说的相同序列是什么意思?这取决于子进程。顺便问一下你有没有查看strace你可以看到strace调用了所有系统调用[你的子进程]希望我能对你有所帮助

标签: c++ linux system-calls ptrace


【解决方案1】:

我曾经遇到过类似的问题(请参阅my question on the topic)。程序启动时,在调用main()之前,会在初始化应用程序(如加载共享库)时执行大量系统调用。我所做的只是允许更多的系统调用并使用另一种安全手段(例如chroot)来防止应用程序访问不需要的文件。

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

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

【讨论】:

  • 同意,PR_SET_SECCOMP 是要走的路。
猜你喜欢
  • 2012-06-21
  • 1970-01-01
  • 2016-04-22
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多