反汇编分析函数传参,调用,执行过程中堆栈变化。

eip保存的是将要执行的下条指令的地址

esp 栈顶指针 保存栈顶地址

ebp 栈底指针 保存栈底地址

 

 

 

 

push 2 :

        sub esp,4

         mov dword ptr ss:[esp],2

 

 

执行完call 指令后有三处变化,说明我们上述分析没有错误。

push ebp :可替换为如下代码

         sub esp,4

          mov dword ptr ss:[esp],ebp //ebp的值为0019FF30

将esp的值赋给ebp提升栈底

上图是我们自己的推断,我们在看看调试其中和我们的是否一致

发觉一致,说明我们推断正确

REP指令:按计数寄存器 (ECX) 中指定的次数重复执行字符串指令

STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元

并且根据标志寄存器中DF位来判断执行完一次stos指令是应该递增还是递减

若DF位为0,则递增,DF位为1,则递减

递增或者递减多少字节由数据宽度来确定,若将eax的值存储到[edi]则递增四个字节

 

上面三条指令实现的功能是:用CCCCCCCCC将缓冲区填充,防止缓冲区溢出

 

pop edi :

       mov edi,dword ptr ss:[esp]

        add esp,4

 

pop ebp

      mov ebp,dword ptr ss:[esp]

     add esp,4

我们发觉,函数调用完成后,esp与原来未执行esp的值不相等

 

调用后

为了平衡堆栈 ,执行add esp,8

执行后堆栈恢复平衡

 

到此,整个函数的调用过程分析完毕

总结:

该函数实现的功能为:

mov eax,dword ptr ss:[ebp+0x8]

add eax,dword ptr ss:[ebp+0xC]

可以修改为c代码

int fun(int a,int b){

return a+b;

}

若a等于1,b=2;

则为1+2

函数参数入栈顺序:从右到左

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发布了53 篇原创文章 · 获赞 17 · 访问量 6277
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 护眼 设计师: 闪电赇

分享到微信朋友圈

×

扫一扫,手机浏览