Linux对ptrace TRACEME调用的影响

时间:2014-06-22 16:34:52

标签: linux gdb ptrace

我有以下代码。它只是调用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.
有人可以解释一下原因吗? 先感谢您。 PS。我知道大多数调试器都会分叉并调用ptrace(PTRACE_TRACEME)'之前'的execve()。没必要提醒我这个。

#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;
}

1 个答案:

答案 0 :(得分:3)

  

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

来自man ptrace

  

<强>错误

     

EPERM 无法跟踪指定的进程。这可能是   因为父母没有足够的特权(必需的   能力是CAP_SYS_PTRACE);非根进程无法跟踪   他们无法向其发送信号或正在运行信号的过程   set-user-ID / set-group-ID程序,原因很明显。   或者,可能已经跟踪了该过程,或者是init(8)(PID 1)。


  使用ptrace(PTRACE_TRACEME)

,我无法使用Ctrl-C(SIGINT)终止进程。它只是停止

来自man ptrace

  

<强>描述

     

在被追踪时,孩子每次信号时都会停止   已发送,即使信号被忽略也是如此。 (例外是   SIGKILL,它具有通常的效果。)将通知父母   它的下一个等待(2)并可以检查和修改子进程   虽然它被停止了。然后父母让孩子继续,   可选地忽略传递的信号(甚至传递信号   不同的信号)。