【问题标题】:How to block tracee catch SIGTRAP with ptrace如何使用 ptrace 阻止 tracee 捕获 SIGTRAP
【发布时间】:2020-05-09 21:59:50
【问题描述】:

当我想检查 tracee 系统调用时,我使用 PTRACE_ATTACH ,然后在循环中使用 PTRACE_SYSCALL ,最后使用 PTRACE_DETACH

问题是,如果被跟踪者注册到 SIGTRAP 或 SIGCONT,它可以在我使用 PTRACE_SYSCALL 或 PTRACE_DETACH 而我不想这样做时改变他的行为。

当我使用PTRACE_ATTACH 附加到tracee 时,tracee 得到了SIGSTOP,但它无法注册/对此信号作出反应,所以没问题。

我使用PTRACE_SYSCALL时tracee无法捕获SIGTRAP或使用PTRACE_CONT时SIGCONT的解决方案是什么

【问题讨论】:

  • 查看我最近的 cmets:stackoverflow.com/questions/61667231/…
  • @CraigEstey 这实际上听起来与此完全相反。在那个问题中,提问者扮演恶意软件作者的角色,并想知道如何阻止安全研究人员使用ptrace 分析他们的恶意软件。在这个问题中,提问者扮演着安全研究员的角色,想知道如何使用ptrace来分析(可能是断点)恶意软件。
  • @JosephSible-ReinstateMonica 防止被追踪者做任何追踪者不想要的事情的技术是相同的。如果您从PTRACE_TRACEME 开始,跟踪器可以修改/抑制它想要的任何跟踪系统调用在发生之前。如果来自PTRACE_ATTACH,则跟踪器可能必须注入代码以撤消被跟踪者已经完成的事情(例如signal(SIGTRAP,SIG_IGN))。
  • @Catig ,跟踪器如何undo signal(SIGTRAP,...) 例如,如果跟踪器在跟踪器附加到跟踪器之前注册到此信号?
  • @Keystone 抑制信号的要点是,您可以在不必取消设置的情况下阻止其信号处理程序运行。

标签: c linux signals ptrace


【解决方案1】:

跟踪器总是在信号处理时获得优先权,它可以选择抑制信号,以便跟踪器的处理程序不运行。您唯一需要担心的是,如果被跟踪者使用sigprocmask 或对pselect 的阻塞调用来阻止信号,并使用sigpendingsignalfd 之类的东西来查找它,您可以通过以下方式修复修改或模拟相关的系统调用。

要抑制信号,只需在 signal-delivery-stop 后恢复时为 sig 传递 0。来自man 2 ptrace

信号注入和抑制

在tracer观察到signal-delivery-stop后,tracer应该重启被调用的tracee

ptrace(PTRACE_restart, pid, 0, sig)

其中PTRACE_restart 是重新启动的 ptrace 请求之一。如果sig 为0,则不传递信号。否则,将传递信号sig。此操作在本手册页中称为信号注入,以区别于信号传递停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2013-12-24
    • 2015-03-13
    • 2020-07-16
    • 1970-01-01
    • 2014-09-14
    • 2012-05-10
    相关资源
    最近更新 更多