如何在 x86 程序集中获取没有堆栈的 eip

How to get eip without stack in x86 assembly

我想设置 esp 依赖于 eip,所以我不能使用堆栈。如何在没有堆栈的情况下获取 eip 的值。

不,在 x86-32 中这是不可能的。 EIP 仅通过 call 指令或 interrupts/traps 从 CPU 泄漏。所有这些方法都将以一种或另一种方式使用堆栈。

(相比之下,x86-64 允许您 lea 相对于 rip。)

如果您无法更改 ESP,则您必须在某些不可能发生中断的上下文中执行,例如,某些中断例程或上下文切换代码,或者您在 ESP 中有垃圾。 (在后一种情况下,我建议您修改代码,使 ESP 始终指向可用于堆栈的区域;这在实践中并不难安排,并且可以防止在使用垃圾 ESP 时代码中出现非常奇怪的错误)。

在这种情况下,您可以将您想要的EIP值编码到mov立即指令操作数中。您可以在汇编程序中将以下内容写入 "get EIP":

   mov   ecx, offset $    ; different assemblers use different syntax for "current address"

   mov   ecx, offset L1
L1: ...

如果您不是用汇编程序编写的,您可以使用 $B8 "mov" 操作码生成与上述等效的二进制文件,提供正确的寄存器值,并用其中的位置填充 immediate32 值你放置了 mov 指令。