x86_64上ptrace的安全性

x86_64上ptrace的安全性,c,x86-64,ptrace,C,X86 64,Ptrace,来自维基百科: long:长有符号整数类型。至少能够包含[−2147483647,+2147483647]范围;因此,它的大小至少为32位 从man ptrace: 请记住,有符号溢出在C中是未定义的行为。x86_64上的寄存器存储64位值 因此,在x86_64上使用ptrace读取寄存器内容(例如ORIG_RAX)是否不安全?当您使用类似ptrace的内容时,您不是在谈论C标准。您已经修复了目标/平台/体系结构(/编译器)。这些东西修复了实现 在这个实现中,行为被定义并且是安全的(因为它对lo

来自维基百科:

long
:长有符号整数类型。至少能够包含[−2147483647,+2147483647]范围;因此,它的大小至少为32位

man ptrace

请记住,有符号溢出在C中是未定义的行为。x86_64上的寄存器存储64位值


因此,在x86_64上使用
ptrace
读取寄存器内容(例如
ORIG_RAX
)是否不安全?

当您使用类似
ptrace
的内容时,您不是在谈论C标准。您已经修复了目标/平台/体系结构(/编译器)。这些东西修复了实现

在这个实现中,行为被定义并且是安全的(因为它对
long
使用64位大小)

因此,不,这不是不安全的。但是,如果您只是复制已编译的二进制文件并在另一个目标上使用,这将是不安全的。

ptrace()
未在POSIX中指定。它在Linux和其他一些系统上可用,所有这些系统都有一个共同点,即它们使用的是x86_64。有了这些平台,您可以拥有64位
long
。所以,这是安全的


(另一方面,Windows使用LLP64,只有
long-long
x86_64
上是64位的)

ptrace()
是特定于Linux的平台,在Linux x86_64上,
long
是64位的(它使用LP64模型)。请注意,在读取寄存器(
ptrace\u GETREGS
)时,值通过
数据返回,未作为返回值返回(“成功时,PTRACE_PEEK*请求返回请求的数据,而根据man的说法,其他请求返回零)。您错过了该引用的一个非常重要的部分。“至少”两张反对票远远不够(“如你所说,这么多”),而且不知道一些事情并不能使一个问题变得有用。在询问之前,你需要先做一些研究。这只是你在学习ptrace时遇到的许多缺点中的第一个。如果将其返回值标准化为
union{intmax_t;void*;}
,可能会更好,但我认为任何负责使ptrace接口合理化的标准委员会都会在走到这一步之前惊慌失措地跑掉。
long ptrace(enum __ptrace_request request, pid_t pid,
            void *addr, void *data);