c - 内联汇编器系统调用 PTRACE(不允许操作)

标签 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 ),此调用不使用其他值。

但是如果我编译并执行程序 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 ++

我做错了什么或者进程不可能跟踪自身吗?

感谢您的帮助。

最佳答案

这不起作用的原因有多种。

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

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

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

接下来的部分描述了不同的安全模块,这些模块可以通过不允许普通用户在自己的进程上执行 ptrace 的方式进行配置。

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

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

关于c - 内联汇编器系统调用 PTRACE(不允许操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748466/

相关文章:

c - 无效函数调用作为表达式

c - 调用 clock() 时出现段错误

c - read(2)ing 结构时如何正确避免 "cast increases required alignment"警告?

java - 带内存的循环内递归的运行时复杂度

c - 位运算的速度差异

assembly - QASM 中的量子计算模拟

assembly - 关于加载字 (lw) 与加载地址 (la) 以及 mips 程序集中偏移的混淆?

c++ - Visual C++ 生成 DIV 而不是 IDIV(x86,整数运算)

linux - linux重启的详细步骤

linux - 带有 cx 寄存器的 NASM 汇编器无限循环