内联汇编程序Syscall PTRACE(不允许操作)

时间:2018-08-08 13:52:13

标签: c assembly system-calls strace ptrace

你好,我有问题

#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#define SYS_PTRACE 101
long my_ptrace(long pid)
{
long ret;
__asm__ volatile(
"mov $0x10, %%rdi\n"
"mov %0, %%rsi\n"
"xor %%rdx,%%rdx\n"
"xor %%r10, %%r10\n"
"mov $0x65, %%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 ++

我有什么问题吗?进程是否可以自我跟踪?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

有多种原因导致此操作无效。

一种可能是您链接的联机帮助页中描述的行为:

  

http://man7.org/linux/man-pages/man2/ptrace.2.html

在此联机帮助页中搜索“ Ptrace访问模式检查”。

后面的部分描述了不同的安全模块,可以以不允许普通用户对其自己的进程进行ptrace的方式进行配置。

甚至可以将其配置为完全禁用“ ptrace”(即使由root启动)。

请注意,除非您是root用户,否则将无法访问由其他用户启动的进程。

答案 1 :(得分:0)

进程无法附加自身,但父级可以附加其孩子。解决方案是分叉。谢谢您的回答。现在

strace -p $PID(of the child) 

返回错误

如果您使用

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