Linux对ptrace TRACEME调用的影响

dae*_*hee 5 linux ptrace gdb

我有以下代码.它只是调用ptrace(PTRACE_TRACEME)然后进入无限循环.我有两个问题.

1. after executing this binary, I can't attach gdb even if I am root.

2. with ptrace(PTRACE_TRACEME), I can't terminate the process with Ctrl-C (SIGINT). it simply stops.
Run Code Online (Sandbox Code Playgroud)

能有人解释我的原因吗?先感谢您.PS.我知道大多数调试器会分叉子,并在'execve()之前调用ptrace(PTRACE_TRACEME)'.没必要提醒我这个.

#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(int argc, char **argv) {

    printf("my pid : %d\n", getpid());  
    ptrace(PTRACE_TRACEME);


    while(1){
        printf("euid : %d\n", geteuid());
        sleep(2);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 5

执行此二进制文件后,即使我是 root,也无法附加 gdb。

man ptrace

错误

EPERM 无法跟踪指定的进程。这可能是因为父级权限不足(所需的能力是 CAP_SYS_PTRACE);出于显而易见的原因,非 root 进程无法跟踪它们无法向其发送信号的进程或运行 set-user-ID/set-group-ID 程序的进程。 或者,该进程可能已经被跟踪,或者是 init(8) (PID 1)。


使用 ptrace(PTRACE_TRACEME),我无法使用 Ctrl-C (SIGINT) 终止进程。它就这样停止了

man ptrace

描述

在被跟踪时,每次传递信号时,即使信号被忽略,子进程也会停止。(SIGKILL 是个例外,它具有通常的效果。)父进程将在下一次 wait(2) 时收到通知,并且可以在子进程停止时检查和修改子进程。然后,父进程让子进程继续,可以选择忽略所传递的信号(或者甚至传递不同的信号)。

  • 一些附加说明:`ptrace(PTRACE_TRACEME)` 设置了一些东西,以便父级是跟踪器。对于任何给定的被跟踪者,一次只能有一个进程可以作为其跟踪者。在另一个进程可以成为跟踪器之前,当前跟踪器需要调用 ptrace(PTRACE_DETACH, Tracee) 或退出。 (3认同)