为什么我需要以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
以root身份输出:
r00t_@:~/memedit$ sudo ./a.out 0 0 140239607693344
为什么我不能附加,当我是我试图附加的过程的所有者?
虽然有些应用程序使用prctl()
来明确禁止PTRACE_ATTACH
(例如ssh-agent),但是在Yama中实现的更一般的解决方案是只允许父进程直接从父进程到子进程(即直接使用gdb
和strace
仍然可用)根用户(即gdb BIN PID
和strace -p PID
仍以strace -p PID
用户身份运行)。 如果本地应用程序受到攻击,攻击者无法附加到其他进程并检查其内存和运行状态。
此行为通过/proc/sys/kernel/yama/ptrace_scope
sysctl值进行控制。 默认值是“1”来阻止非子ptrace
调用。 值“0”恢复更宽容的行为,这可能更适合于只有管理帐户的开发系统和/或服务器。 使用sudo
也可以通过CAP_SYS_PTRACE
功能临时授予ptrace
权限,尽管此方法允许任何进程的ptrace
。