了解QWORD PTR表示的地址位置



我遇到以下汇编指令and rax, qword ptr [0xff5ff098]

我想知道的是什么是内存地址,将在以下说明中访问。内存地址0xff5ff098是否扩展为零,还是将其扩展到最重要的位?

Intel Pin工具中,API IARG_MEMORYREAD_EA将其作为1的扩展为1,即给出以下地址0xffffffffff5ff098。这个地址可能地址吗?

我正在使用64位机器。

如何编码?rip层或绝对?

如果绝对,则使用sign-extended-disp32地址模式(因为地址模式中的32位位移是始终扩展的符号,即使不涉及寄存器)。

)。

如果是rip层的,则您的拆卸器应显示正确的最终地址,该地址是根据RIP REL32计算的。

您的拆卸器或PIN都显示出错误的显示,因为它确实签名到64位,您的拆卸器应该向您展示。


是的,在X86-64中,RIP相关性和绝对解决方案都是可能的。

x86-32有两种冗余方法来编码没有寄存器的[disp32]地址模式。x86-64将较短的重新调整为rip叠层,并将越长的 [sign-extended-disp32]绝对地址保留。

我将使用nasm语法进行示例。您可以使用default rel默认使用RIP-RELATIVE,并且可以按照此类情况逐步覆盖:

  MOV     RAX, [abs FS:_start]    ; _start just as something that assembles
  MOV     RAX, [rel FS:_start]    ; RIP-rel for thread-local is usually not useful!
 64 48 8b 04 25 b5 00 40 00   mov rax,QWORD PTR fs:0x4000b5
 64 48 8b 05 e7 fe ff ff      mov rax,QWORD PTR fs:[rip+0xfffffffffffffee7]  # 4000b5 <_start>

此地址是一个可能的地址吗?

是的,使用了规范范围的上半部分的地址。例如less /proc/self/maps显示Linux映射vsyscall页面,其导出到高地址空间:

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

规范地址意味着位 [63:48]是位47的副本。非传统地址将始终在当前硬件上发生故障,因此,如果您想实现具有这些冗余位的标记指针,则仍然必须在退出之前重做签名。


请注意,qword ptr告诉您操作数大小,而不是关于如何编码地址模式的任何内容。

最新更新