zoukankan      html  css  js  c++  java
  • 经典的EBP寻址

    前言:比起ESP寻址的方式,EBP需要去理解下其中的含义,所以记录下!

    个人理解:

    1、EBP和ESP之间的关系

    起初-1 相隔  ---->  在没进CALL之前,会先将调用CALL的参数先压入堆栈,堆栈中EBP寄存器中的地址是在ESP寄存器中的地址之下, 自己理解为相隔
    
    中间-2 相等  ---->  进入CALL之后,EBP寄存器会先把保存的地址先压入堆栈中保存,然后再保存ESP寄存器中的地址,这里就可以理解为ESP不变,将EBP进行提升栈顶的操作
    
    中间-3 相隔  ---->  因为调用了CALL,那么就会进行一系列的运算,那么肯定需要堆栈中的空间,那么ESP地址就会上升
    
    中间-4 相等  ---->  当调用完了之后,当前EBP寄存器保存的就是之前的ESP的地址,现在就会返回给ESP寄存器,堆栈需要保持平衡
    
    末尾-5 相隔  ---->  堆栈到现在还没有完全保持平衡,还需要把EBP的地址返回给EBP寄存器,然后出了CALL之后,还需要指令进行外/内平衡的操作保持真正的堆栈平衡!
    

    汇编体现:

    00401000 >    6A 01         push 0x1                                 ;  压入堆栈0x1
    00401002      6A 02         push 0x2                                 ;  压入堆栈0x2
    00401004      E8 3C000000   call CRACKME.00401045                    ;  调用call 00401045
    00401009      83C4 08       add esp,0x8                              ;  恢复两个参数的堆栈数,所以+8
    0040100C   .  6A 00         push 0x0                                 ; /
    0040100E   .  68 F4204000   push CRACKME.004020F4                    ; |
    00401013   .  E8 A6040000   call <jmp.&USER32.FindWindowA>           ; 
    00401018   .  0BC0          or eax,eax
    0040101A   .  74 01         je short CRACKME.0040101D
    0040101C   .  C3            retn
    0040101D   >  C705 64204000>mov dword ptr ds:[0x402064],0x4003
    00401027   .  C705 68204000>mov dword ptr ds:[0x402068],CRACKME.WndP>;  è
    00401031   .  C705 6C204000>mov dword ptr ds:[0x40206C],0x0
    0040103B   .  C705 70204000>mov dword ptr ds:[0x402070],0x0
    00401045      55            push ebp                                 ;  保存原始ebp地址
    00401046      8BEC          mov ebp,esp                              ;  再让当前ebp中保存esp的地址
    00401048      83EC 10       sub esp,0x10                             ;  提升栈顶,用于保存其他要用到的东西,当前没有体现用处
    0040104B      8B45 08       mov eax,dword ptr ss:[ebp+0x8]           ;  CRACKME.<ModuleEntryPoint>
    0040104E      0345 0C       add eax,dword ptr ss:[ebp+0xC]
    00401051      8BE5          mov esp,ebp                              ;  把之前保存的ebp返回给esp
    00401053      5D            pop ebp                                  ;  再把之前压入的ebp地址返回给ebp寄存器
    00401054      C3            retn                                     ;  跳出
    
  • 相关阅读:
    网站访问量和服务器带宽的选择
    PHP实现四种基本排序算法
    常用的PHP排序算法以及应用场景
    常见的mysql数据库sql语句的编写和运行结果
    MyBatis拦截器:给参数对象属性赋值
    《自律让你自由》摘要
    Java JDK1.5、1.6、1.7新特性整理(转)
    人人都能做产品经理吗?
    Windows下查询进程、端口
    一语收录(2016-09-18)
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12307298.html
Copyright © 2011-2022 走看看