内联汇编程序系统调用 PTRACE(不允许操作)
Inline Assembler Syscall PTRACE(Operation not permitted)
你好,我有一个问题
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#define SYS_PTRACE 101
long my_ptrace(long pid)
{
long ret;
__asm__ volatile(
"mov [=10=]x10, %%rdi\n"
"mov %0, %%rsi\n"
"xor %%rdx,%%rdx\n"
"xor %%r10, %%r10\n"
"mov [=10=]x65, %%rax\n"
"syscall" : :"g"(pid));
__asm__ volatile("mov %%rax, %0" : "=r"(ret));
return ret;
}
int main()
{
long a = getpid();
my_ptrace(a);
printf("Hello World\n %d", a);
return 0;
}
首先我将 0x10 或 16 移动到 rdi 中,根据 https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/+/jb-dev/sysroot/usr/include/sys/ptrace.h
这是 PTRACE_ATTACH 的数字
随后将 PID 移至 rsi (http://man7.org/linux/man-pages/man2/ptrace.2.html),此调用未使用其他值。
但是如果我编译并执行 Programm strace 输出
[...]
arch_prctl(ARCH_SET_FS, 0x7f4eac1fa500) = 0
mprotect(0x7f4eac1ef000, 16384, PROT_READ) = 0
mprotect(0x55fb014bd000, 4096, PROT_READ) = 0
mprotect(0x7f4eac240000, 4096, PROT_READ) = 0
munmap(0x7f4eac1fb000, 113090) = 0
getpid() = 4328
ptrace(PTRACE_ATTACH, 4328) = -1 EPERM (Die Operation ist nicht erlaubt)
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
brk(NULL) = 0x55fb02077000
brk(0x55fb02098000) = 0x55fb02098000
write(1, "Hello World\n", 12Hello World
) = 12
write(1, " 4328", 5 4328) = 5
exit_group(0) = ?
+++ exited with 0 ++
我是不是出了什么问题,或者进程不可能跟踪自身?
谢谢你的帮助。
这不起作用的原因有很多。
一个可能是您链接的联机帮助页中描述的行为:
在此联机帮助页中搜索 "Ptrace access mode checking"。
接下来的部分描述了不同的安全模块,这些模块可以通过不允许普通用户对其自己的进程执行 ptrace 的方式进行配置。
它甚至可以配置为完全禁用 "ptrace"(即使由 root 启动)。
请注意,将无法访问由其他用户启动的进程(除非您是根用户)。
进程无法附加自身,但父进程可以附加他的子进程。分叉是解决方案。谢谢您的回答。现在
strace -p $PID(of the child)
returns 一个错误
如果您正在使用
strace -f ./Programm
strace 将在父级能够执行之前附加到子级,系统调用将失败。
这里我追踪到了父级
[....]
rk(0x562f67a93000) = 0x562f67a93000
write(1, "My process ID : 1801\n", 21My process ID : 1801
) = 21
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f28dc5547d0) = 1802
ptrace(PTRACE_ATTACH, 1802) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_TRAPPED, si_pid=1802, si_uid=1000, si_status=SIGSTOP, si_utime=0, si_stime=0} ---
nanosleep({tv_sec=50, tv_nsec=0}, 0x7ffc95baaf30) = 0
你好,我有一个问题
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#define SYS_PTRACE 101
long my_ptrace(long pid)
{
long ret;
__asm__ volatile(
"mov [=10=]x10, %%rdi\n"
"mov %0, %%rsi\n"
"xor %%rdx,%%rdx\n"
"xor %%r10, %%r10\n"
"mov [=10=]x65, %%rax\n"
"syscall" : :"g"(pid));
__asm__ volatile("mov %%rax, %0" : "=r"(ret));
return ret;
}
int main()
{
long a = getpid();
my_ptrace(a);
printf("Hello World\n %d", a);
return 0;
}
首先我将 0x10 或 16 移动到 rdi 中,根据 https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/+/jb-dev/sysroot/usr/include/sys/ptrace.h
这是 PTRACE_ATTACH 的数字随后将 PID 移至 rsi (http://man7.org/linux/man-pages/man2/ptrace.2.html),此调用未使用其他值。
但是如果我编译并执行 Programm strace 输出
[...]
arch_prctl(ARCH_SET_FS, 0x7f4eac1fa500) = 0
mprotect(0x7f4eac1ef000, 16384, PROT_READ) = 0
mprotect(0x55fb014bd000, 4096, PROT_READ) = 0
mprotect(0x7f4eac240000, 4096, PROT_READ) = 0
munmap(0x7f4eac1fb000, 113090) = 0
getpid() = 4328
ptrace(PTRACE_ATTACH, 4328) = -1 EPERM (Die Operation ist nicht erlaubt)
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
brk(NULL) = 0x55fb02077000
brk(0x55fb02098000) = 0x55fb02098000
write(1, "Hello World\n", 12Hello World
) = 12
write(1, " 4328", 5 4328) = 5
exit_group(0) = ?
+++ exited with 0 ++
我是不是出了什么问题,或者进程不可能跟踪自身?
谢谢你的帮助。
这不起作用的原因有很多。
一个可能是您链接的联机帮助页中描述的行为:
在此联机帮助页中搜索 "Ptrace access mode checking"。
接下来的部分描述了不同的安全模块,这些模块可以通过不允许普通用户对其自己的进程执行 ptrace 的方式进行配置。
它甚至可以配置为完全禁用 "ptrace"(即使由 root 启动)。
请注意,将无法访问由其他用户启动的进程(除非您是根用户)。
进程无法附加自身,但父进程可以附加他的子进程。分叉是解决方案。谢谢您的回答。现在
strace -p $PID(of the child)
returns 一个错误
如果您正在使用
strace -f ./Programm
strace 将在父级能够执行之前附加到子级,系统调用将失败。
这里我追踪到了父级
[....]
rk(0x562f67a93000) = 0x562f67a93000
write(1, "My process ID : 1801\n", 21My process ID : 1801
) = 21
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f28dc5547d0) = 1802
ptrace(PTRACE_ATTACH, 1802) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_TRAPPED, si_pid=1802, si_uid=1000, si_status=SIGSTOP, si_utime=0, si_stime=0} ---
nanosleep({tv_sec=50, tv_nsec=0}, 0x7ffc95baaf30) = 0