我很少使用汇编语言,所以需要专家帮助解码我必须处理的一小段代码。
0000: 48 ff 25 61 57 07 00 rex.W jmp QWORD PTR [rip+0x75761] # 0x75768
0007: cc int3
这是一次内存间接跳转至rip+0x75761
处的8字节/64位地址,因此跳转目标的绝对地址从中加载的值为0007 + 0x75761
= 0x75768
,对吗?
我很少使用汇编语言,所以需要专家帮助解码我必须处理的一小段代码。
0000: 48 ff 25 61 57 07 00 rex.W jmp QWORD PTR [rip+0x75761] # 0x75768
0007: cc int3
这是一次内存间接跳转至rip+0x75761
处的8字节/64位地址,因此跳转目标的绝对地址从中加载的值为0007 + 0x75761
= 0x75768
,对吗?
这是在x86-64上的标准尾递归序列,由Microsoft编译器生成。
是的,正如您所说,它是对64位内存地址0x75768
的间接跳转。在执行此代码时,rip
等于7,因此rip + 0x75761
== 0x7 + 0x75761
== 0x75768
。该代码将无条件地转移控制到地址0x75768
处的指令。
随后的int 3
只是填充,但它也起到了墙的作用。由于前一个指令中的无条件分支,因此不应该到达此点。如果到达了,CPU会陷入陷阱,因为这是“断点”中断。
在这种情况下,这并不是严格必要的,因为这是一个带有IP相对操作数的间接跳转,但编译器显然仍在发出它。它处理这个的逻辑可能并不复杂,也许它总是生成这个代码以保持一致性。或者官方文档没有详细说明堆栈展开代码的实现方式。多一点REX.W前缀也没有真正的劣势,所以最好还是安全第一。
0x48
字节将是dec
或inc
。(我想是dec eax
)。 - Peter Cordes