我有以下代码。它只是调用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;
}
答案 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)并可以检查和修改子进程 虽然它被停止了。然后父母让孩子继续, 可选地忽略传递的信号(甚至传递信号 不同的信号)。