zoukankan      html  css  js  c++  java
  • 对寄存器ESP和EBP的一些理解

     
      前言:对于经常接触逆向或者汇编的肯定都对push ebp,mov    ebp, esp这两句印象深刻,由于他们经常出现在过程的开头,这也是找段首的一个依据,但是,过程为啥总要以这两句开头,这其中又有什么道理呢?
      参考自:https://www.cnblogs.com/mengfanrong/p/5421878.html
     
    以下是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
    push   p2    ;參数2入栈, ESP -= 4h , ESP = 0xAAAAAA6
    0xAAAAAAA - 8h =     call test    ;压入返回地址 ESP -= 4h, ESP = 0xAAAAA9D,注意:这里是test函数的。即在代码段中的地址(偏移)。
    ;//进入函数内
    push   ebp                           ;保护先前EBP指针, EBP入栈(即0xAAAAAB0入栈。注意与返回地址差别), ESP-=4h, ESP = 0xAAAAA99
    0xAAAAA99
    ;ebp+0ch为 mov    ebx, dword ptr  [ebp+08h]   ;ebp+08h为 sub    esp, 8                     ;局部变量所占空间ESP-=8, ESP = 0xAAAAA91
    add    esp, 8                     ;释放局部变量, ESP+=8, ESP = 0xAAAAA99
     即把栈中地址0xAAAAA9D的内容pop到ebp中
    0xAAAAAA2, 后面加操作数8为平衡堆栈,ESP+=8,ESP= }
    原来ESP就是一直指向栈顶的指针,而EBP仅仅是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数參数、局部变量等。
  • 相关阅读:
    一、初识数据库
    面向对象—基础、名称空间、三大特性
    六、内置函数
    五、迭代器、生成器、装饰器
    四、global和nonlocal、函数名应用、格式化输出
    三、名称空间
    二、函数的参数
    shell脚本
    线性代数
    [模块] python调用java代码-jpype
  • 原文地址:https://www.cnblogs.com/2f28/p/9751178.html
Copyright © 2011-2022 走看看