【问题标题】:Linux effect of ptrace TRACEME callptrace TRACEME调用的Linux效果
【发布时间】:2014-08-12 17:59:46
【问题描述】:

我有以下代码。它只是调用 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.

谁能解释一下原因?? 先感谢您。 附言。我知道大多数调试器分叉子并调用 ptrace(PTRACE_TRACEME) 'before' 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;
}

【问题讨论】:

    标签: linux gdb ptrace


    【解决方案1】:

    执行此二进制文件后,即使我是 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)并可能检查和修改子进程 当它停止时。然后父母让孩子继续, 可选地忽略传递的信号(甚至传递一个 不同的信号)。

    【讨论】:

    • 一些附加说明:ptrace(PTRACE_TRACEME) 设置了一些东西,以便父级是跟踪器。对于任何给定的跟踪者,一次只能有一个进程作为其跟踪者。在另一个进程可以成为跟踪器之前,当前跟踪器需要调用ptrace(PTRACE_DETACH, tracee) 或退出。
    猜你喜欢
    • 2011-01-22
    • 2011-07-26
    • 2020-11-30
    • 2010-10-26
    • 2016-03-26
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多