我有以下代码.它只是调用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) 时收到通知,并且可以在子进程停止时检查和修改子进程。然后,父进程让子进程继续,可以选择忽略所传递的信号(或者甚至传递不同的信号)。