我遇到以下汇编指令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
告诉您操作数大小,而不是关于如何编码地址模式的任何内容。