为什么我需要以 root 身份运行(而不是 r00t_)?
// main()
scan.scanProcessOffset(10838, 0x7f8c14000000); // proper pid and offset
void MemoryMapper::scanProcessOffset(unsigned int procId, unsigned long long offset)
{
long attach = ptrace(PTRACE_ATTACH, procId, NULL, NULL);
cout << attach << endl << errno << endl;
long memory = ptrace(PTRACE_PEEKDATA, procId, offset);
if (memory == -1 && errno == 3)
{
cout << errno << endl;
errno = 0;
}
cout << memory;
}
如你所见,我连接的进程归 r00t_ 所有
r00t_@:/proc/10838$ ls -l
lrwxrwxrwx 1 r00t r00t_ 0 2012-04-15 08:21 exe -> /usr/bin/gedit
-rw------- 1 r00t r00t_ 0 2012-04-15 09:04 mem
输出不以root身份运行:
r00t_@:~/memedit$ ./a.out
-1
1
3
-1
作为根输出:
r00t_@:~/memedit$ sudo ./a.out
0
0
140239607693344
当我是要附加到的进程的所有者时,为什么我不能附加?
最佳答案
虽然一些应用程序使用 prctl()
来明确禁止 PTRACE_ATTACH
(例如 ssh-agent),但在 Yama 中实现了一个更通用的解决方案是只允许 ptrace
直接从父进程到子进程(即直接 gdb
和 strace
仍然有效),或者作为 root 用户(即 gdb BIN PID
和 strace -p PID
仍然可以作为 root 使用)。
如果本地应用遭到破坏,攻击者将无法附加到其他进程并检查它们的内存和运行状态。
此行为通过 /proc/sys/kernel/yama/ptrace_scope
sysctl 值控制。默认值为“1”以阻止非子 ptrace
调用。 “0”值恢复更宽松的行为,这可能更适合开发系统和/或只有管理帐户的服务器。使用 sudo
还可以通过 CAP_SYS_PTRACE
功能临时授予 ptrace
权限,尽管此方法允许任何进程的 ptrace
.
关于c++ - ptrace PTRACE_ATTACH 失败 - 用户拥有的进程的 Linux 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10163678/