Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 什么是;mov rax,QWORD PTR fs:0x28“;组装说明怎么办?_Linux_Assembly_Gdb_X86 64 - Fatal编程技术网

Linux 什么是;mov rax,QWORD PTR fs:0x28“;组装说明怎么办?

Linux 什么是;mov rax,QWORD PTR fs:0x28“;组装说明怎么办?,linux,assembly,gdb,x86-64,Linux,Assembly,Gdb,X86 64,在执行此指令之前,fs包含0x0 另外,我想知道如何从GDB中的这个内存区域读取数据,该命令是什么?现代操作系统(如Linux和Windows)中的fs和gs寄存器指向特定于线程和其他操作系统定义的结构。修改段寄存器是受保护的指令,因此只有操作系统可以为您设置这些指令 这个问题应该有助于解释这一点的确切含义: fs寄存器的实际值不是地址。它是一个选择器——GDT中的偏移量,用于描述该段可以/不能用于什么。您看不到隐藏的fs基寄存器和限制寄存器的值是什么-它们是内部CPU寄存器,仅通过向fs写入新

在执行此指令之前,fs包含0x0


另外,我想知道如何从GDB中的这个内存区域读取数据,该命令是什么?

现代操作系统(如Linux和Windows)中的
fs
gs
寄存器指向特定于线程和其他操作系统定义的结构。修改段寄存器是受保护的指令,因此只有操作系统可以为您设置这些指令

这个问题应该有助于解释这一点的确切含义:


fs
寄存器的实际值不是地址。它是一个选择器——GDT中的偏移量,用于描述该段可以/不能用于什么。您看不到隐藏的fs基寄存器和限制寄存器的值是什么-它们是内部CPU寄存器,仅通过向fs写入新的“选择器”来更新(此时基寄存器/限制寄存器从GDT更新)。

请参阅第一部分谢谢,从我看到的类似指令来看,它看起来只是从[fs+0x28]读取进入rax。由于fs是0x0,这应该简单地转换为0x28,但是当我尝试在GDB中读取0x28时,我不允许这样做,但是程序本身可以执行此指令。因此,这可能不是对该指令功能的正确理解?正如我们所说的受保护模式,“因为fs是0x0,它应该失败”更为正确,但是:在64位模式下,没有使用分段:而是有一个隐藏的“fs base”寄存器,fs的值与此无关。在Windows中,FS用于指向线程信息块的开头。从FS处的偏移量读取是获取当前线程ID、当前时间、最后一个错误等的极其便宜的方法。您确定这是Linux代码,而不是Windows代码吗?另请参见,FS值零在受保护模式下是完全合法的。只要xDT[0]上有一个段描述符。谢谢,但是我如何从GDB中读取这个内存呢?在具有FSGSBASE功能的CPU上,64位代码可以使用和
wrfsbase
。他们没有特权。(我不知道该扩展有多旧。)此外,修改段寄存器本身也没有特权;您需要内核的帮助,因为如果没有FSGSBASE,内核需要更新LDT中该段描述的基址,这当然是用户空间无法访问的。如果有第二个段描述包含您想要的基址,我想您可以在用户空间中使用
mov fs,eax
,并在多个fs基址之间来回切换,而不需要调用内核。@Peter我觉得您在跟踪我:-),但真的,感谢您跟踪所有这些答案;我从你的评论中学到了很多。当我有时间的时候,我会尽量记住跟进这件事(以及其他事情)。我认为您更改
fs
是正确的。