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

时间:2015-05-07 02:28:10

标签: assembly x86

我想设置esp取决于eip,因此我无法使用堆栈。如何在没有堆栈的情况下获得eip的值。

2 个答案:

答案 0 :(得分:5)

不,这在x86-32中是不可能的。 EIP仅通过call指令或中断/陷阱从CPU泄漏。所有这些方法都会以某种方式使用堆栈。

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

答案 1 :(得分:1)

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

在这种情况下,您可以将所需的EIP值编码为mov立即指令操作数。您可以在汇编程序中编写以下内容以“获取EIP”:

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

   mov   ecx, offset L1
L1: ...

如果你不是用汇编语言编写的,你可以使用$ B8“mov”操作码生成上面的二进制等价物,提供正确的寄存器值,并用你放置mov的位置填充immediate32值指令。