2

为什么我需要以 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

当我是我试图附加到的进程的所有者时,为什么我不能附加?

4

1 回答 1

6

虽然某些应用程序用于prctl()明确禁止(例如 ssh-agent),但在YamaPTRACE_ATTACH中实现的更通用的解决方案是只允许直接从父进程到子进程(即直接且仍在工作),或作为 root 用户(即,和仍然以root身份工作)。如果本地应用程序受损,攻击者将无法附加到其他进程并检查它们的内存和运行状态。ptracegdbstracegdb BIN PIDstrace -p PID

此行为通过/proc/sys/kernel/yama/ptrace_scopesysctl 值控制。默认值为“1”以阻止非子ptrace呼叫。“0”值恢复更宽松的行为,这可能更适合开发系统和/或只有管理帐户的服务器。Usingsudo也可以ptrace通过该功能临时授予权限CAP_SYS_PTRACE,尽管此方法允许ptrace任何进程的权限。

于 2012-04-15T16:32:11.683 回答