为什么我需要以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
当我是我想要附加的流程的所有者时,为什么我无法附上?
答案 0 :(得分:5)
虽然有些应用程序使用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
也可以通过ptrace
功能临时授予CAP_SYS_PTRACE
权限,但此方法允许ptrace
任何进程。