CPU寄存器详解 转载

*CPU寄存器***

用作用于快速访问数据的小型存储区。在x86(32位)架构中,有8个通用寄存器:EAX,EBX,ECX,EDX,EDI,ESI,EBP和ESP。尽管它们最初是为执行特定任务而设计的,但从技术上讲,它们可以用于存储任何数据,并且在许多情况下,至今仍以这种方式使用它们。

img

每个方面都有更多细节……

EAX –累加器寄存器。

之所以称为累加器寄存器,是因为它是用于通用计算(例如ADD和SUB)的主要寄存器。虽然其他寄存器可用于计算,但通过为其分配更有效的一字节操作码,EAX被赋予了优先权。当针对有限的可用缓冲区空间编写漏洞利用Shellcode时,这种效率非常重要(有关更多信息,请参见以后的教程!)。除了在计算中使用之外,EAX还用于存储函数的返回值。

通用寄存器可以全部或部分引用如下:EAX完全指32位寄存器。AX表示最低有效16位,可进一步细分为AH(AX的8个最高有效位)和AL(8个最低有效位)。

这是基本的视觉表示:

EAX

相同的完整/部分32位,16位和8位引用也适用于接下来的三个寄存器(EBX,ECX和EDX)

EBX –基址寄存器。

在32位体系结构中,EBX并没有真正的特殊用途,因此可以将其视为可用存储的全部内容。与EAX一样,它可以全部(EBX)或部分(BX,BH,BL)引用。

ECX –计数器寄存器。

顾名思义,计数器(或计数)寄存器经常用作循环和功能重复计数器,尽管它也可以用于存储任何数据。与EAX一样,它可以全部(ECX)或部分(CX,CH,CL)引用。

EDX –数据寄存器

EDX有点像EAX的合作伙伴注册。它通常用于除法和乘法之类的数学运算中,以处理溢出问题,其中最高有效位将存储在EDX中,最低有效位将存储在EAX中。它还通常用于存储函数变量。与EAX一样,它可以全部(EDX)或部分(DX,DH,DL)引用。

ESI-来源索引

与EDI相对应的是,ESI通常用于存储指向读取位置的指针。例如,如果某个函数旨在读取字符串,则ESI将保留指向该字符串位置的指针。

EDI –目标索引

尽管EDI可以(并且可以)用于常规数据存储,但EDI的主要目的是存储函数的存储指针,例如字符串操作的写入地址。

EBP –基本指针

EBP用于跟踪堆栈的底部/底部。它通常用于通过使用EBP当前值的偏移量来引用位于堆栈上的变量,尽管如果仅通过寄存器引用参数,则您可以选择将EBP用于一般用途。

ESP –堆栈指针

ESP用于跟踪堆栈的顶部。当项目在堆栈中移入和移出时,ESP相应地增加/减少。在所有通用寄存器中,ESP很少/从未用于其预期用途以外的任何用途。

指令指针(EIP)

EIP不是通用寄存器,但适合于在此覆盖,它指向要由CPU执行的下一条指令的存储器地址。正如您将在接下来的教程中看到的那样,控制EIP的值,并且可以控制应用程序的执行流程(执行您选择的代码)。

段寄存器和EFLAGS寄存器

EFLAGS

您将在“寄存器”窗格中看到两个附加寄存器,即段寄存器和EFLAGS寄存器。我不会详细介绍这两者,但是请注意,EFLAGS寄存器由一系列标志组成,这些标志表示通过计算和比较得出的布尔值,并且可以用于确定何时/是否进行条件跳转(稍后将详细介绍)。

有关CPU寄存器的更多信息,请查看以下资源:

  • http://wiki.skullsecurity.org/Registers
  • http://www.swansontec.com/sregisters.html
赞(1)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址