Assembly 当ESP==EBP时会发生什么

Assembly 当ESP==EBP时会发生什么,assembly,x86,buffer-overflow,Assembly,X86,Buffer Overflow,众所周知,堆栈从高内存位置增长到低内存位置 ESP→ 堆栈顶部的点 EBP→ 指向堆栈的底部 当ESP>EBP时,缓冲区溢出发生。那个么,当ESP==EBP时会发生什么呢?EBP并没有指向堆栈的底部。它指向你设置它指向的任何地方。不,调用函数不会改变EBP。函数本身可以将其用作帧指针或通用寄存器。此外,标准的调用约定要求保留EBP,以便调用方看不到任何更改。EBP只是一个辅助寄存器,用于帮助操纵ESP。在x86中,i't自动分段为SS:,因此使用它而不是另一个寄存器。您是指堆栈下溢而不是缓冲区溢

众所周知,堆栈从高内存位置增长到低内存位置

ESP→ 堆栈顶部的点
EBP→ 指向堆栈的底部


当ESP>EBP时,缓冲区溢出发生。那个么,当ESP==EBP时会发生什么呢?

EBP
并没有指向堆栈的底部。它指向你设置它指向的任何地方。不,调用函数不会改变EBP。函数本身可以将其用作帧指针或通用寄存器。此外,标准的调用约定要求保留EBP,以便调用方看不到任何更改。EBP只是一个辅助寄存器,用于帮助操纵ESP。在x86中,i't自动分段为SS:,因此使用它而不是另一个寄存器。您是指堆栈下溢而不是缓冲区溢出吗?在调用堆栈上很难获得下溢,如果这样做,几乎可以肯定是由其他(意外或恶意)内存覆盖错误引起的,而不是由调用链引起的下溢。硬件不会直接从ESP寄存器检测堆栈下溢,但可能会检测对已建立堆栈过高地址的内存访问;如果您正在谈论将EBP用作帧指针,那么这意味着您的函数只是将EBP设置为帧指针,并且尚未在其堆栈帧中保留任何空间。