【问题标题】:Conditions that make a tracee stopped, even though its parent didn't require it使被跟踪者停止的条件,即使它的父级不需要它
【发布时间】:2022-01-18 11:45:29
【问题描述】:

我正在尝试学习使用 ptrace,我编写了一个简单的程序集存根,它 1/ 调用 ptrace(0,0,0,0)(系统调用,而不是 libc 函数)。然后显示 hello world 然后生成一个 shell。我从 bash shell 运行我的代码。 显示 Hello world,但是我的进程在 execve(/bin/sh) 之前停止(我收到后台进程的 bash 通知) 是因为 ptrace 吗?同样,当发出“fg”命令继续执行时,什么也没有发生,我必须关闭终端,因为 ctrl-c 不起作用......到底发生了什么?

【问题讨论】:

    标签: x86 gdb x86-64 ptrace


    【解决方案1】:

    来自execve man page

    如果正在对当前程序进行 ptrace,则在成功执行 execve() 后会向其发送 SIGTRAP 信号。

    使用ptrace(PTRACE_TRACEME) 使您的进程成为其父进程的跟踪者,因此即使父进程 PTRACE_ATTACH 或进行任何其他 ptrace 系统调用,execve SIGTRAP 行为也适用于您的进程.例如如果它是像 bash 这样的普通 shell,而不是像 GDB 这样的调试器。 (我假设PTRACE_TRACEME0。)

    另请参阅How does gdb start an assembly compiled program and step one line at a time?,了解 GDB 如何在 fork 之后但在 execve 之前使用 ptrace(PTRACE_TRACEME),以便 GDB 进程可以跟踪新进程。

    【讨论】:

    • 我认为不可能在被跟踪者中处理这个 SIGTRAP,以便即使父母不希望跟踪你也能正常运行?
    • @AaaBbb:可能不会,我认为它是在 execve 替换旧进程(包括其信号处理程序和 sigaction 设置)之后交付的,我认为您不能让忽略 SIGTRAP 在 execve 中持续存在。是的,sigactionexecve 将信号配置重置为默认值。但是 IDK 为什么你想在一个没有与特定父级积极合作的进程中运行PTRACE_TRACEME。只是不要一开始就这样做,除了在 fork 之后,就在 execve 之前!如果你想附加到另一个进程,只需使用PTRACE_ATTACH
    • 我明白了,我只是想实现一种反调试安全技术,如果 ptrace==-1 我们退出,否则我们开始执行恶意软件(在我们的例子中是一个 shell)。但我现在明白它仅限于非 SIGTRAP 导致指令,如 exec。