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

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

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

 

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