这里有很多问题都提到了eip
:
什么是 EIP?它是如何使用的,既作为漏洞利用目标,又用于良性代码?
这里有很多问题都提到了eip
:
什么是 EIP?它是如何使用的,既作为漏洞利用目标,又用于良性代码?
EIP 是 x86 架构(32 位)中的寄存器。它保存堆栈的“扩展指令指针”。换句话说,它告诉计算机下一步去哪里执行下一个命令并控制程序的流程。
研究汇编语言以更好地了解寄存器的工作原理。Skull Security有一个很好的入门知识。
计算机需要跟踪的基本内容之一是当前正在执行的指令在内存中的位置。
这通常由CPU使用通常称为Instruction Pointer
orProgram counter
寄存器来完成。确切的名称取决于架构,但该概念可以概括所有架构。它被称为Intel CPUs上的指令指针,这就是我将在此答案中使用的术语。
指令指针在从内存中执行指令时不断增加,并且每当执行某种跳转指令时也会更新(jmp
,jle
等)。具有多个并行执行管道和多个内核的现代CPU架构使得CPU内部实际发生的事情更加复杂,但对于外部观察者来说,简单的解释足以理解发生了什么以及相关寄存器的用途。
由于旧Intel 8086/8088
的16 位80186
处理器,指令指针通常表示80286
为一对16 位值,称为(代码选择器,但在保护模式下,选择器的功能与段非常相似)和指令指针。Code Segment
80286
在汇编语言CS:IP
中,冒号表示一个段和一个偏移量的配对,以形成一个内存地址。CS
这里IP
是CPU 寄存器- CPU 芯片本身内的微小内存位置 - 在这种特殊情况下,每个16 位大小。
你也有类似的东西DS:DX
,通常是在内存中读取或写入数据的位置;DS
是数据段,DX
是一个通用寄存器,在这种情况下保存数据段偏移量。最初有四个用于一般用途的寄存器,分别称为AX
、和,每个寄存器都可以用高半部分来寻址 -例如 - 或低半部分 - ,加上少量的通用- 具有特定预期用途的用途寄存器。现代 CPU 有很多很多的寄存器,常见的有几十个寄存器,而且有上百个寄存器并非闻所未闻。BX
CX
DX
AH
AL
80386
在1980 年代后期制造CPU 时,Intel 做了很多改变,包括将地址空间扩展到 32 位,同时保留选择器作为概念。由于这个原因,旧的 16 位值不再足够,指令指针被扩展为 32 位。为了保持完全的向后兼容性(此时,英特尔可能已经吸取了 80286 的教训,后者更加单向兼容;从8086/8088
'实模式进入80286
'保护模式很容易,但返回困难得多,这在实践中被证明是一个问题),这需要一个新的寄存器供 CPU 在 32 位模式下运行时保存指令指针。
在 中80386
,扩展(32 位)寄存器被命名,Exx
而相应的16 位寄存器在以前称为xx。所以你会得到例如旧的 16 位累加器寄存器 AX 加上扩展的 32 位累加器寄存器EAX
(AX
作为低16 位一半)。在这个命名约定相一致,在扩展指令指针寄存器被称作EIP
。
顺便说一句,大多数情况下,正确的值不仅仅是EIP
,而是CS:EIP
,因为 的值EIP
仍然是与代码选择器定义的某个起始位置的偏移量。