C语言2-参数的传递与返回值

admin 2018年5月13日01:40:57评论515 views字数 769阅读2分33秒阅读模式
摘要

调用函数调用:下面是call内部堆栈没有变化出了call,在调用后执行的语句此时,已恢复堆栈,但是堆栈上留下一堆垃圾信息,这些信息随时都可以被利用!

short plus(short x,short y,short z,short m) {         return x+y+z+m;  }  void main()                        //入口程序 程序开始执行的地方 {          //调用函数         plus(1,2,3,4);          return;                        //执行结束 } 找到plus函数的反汇编  理解每一行汇编代码  找到参数是如何传递  返回值是如何返回的 

plus函数对应反汇编代码和意义

调用函数调用:

push 4 push 3 push 2 push 1 call  (plus) 0041100f add esp,10h

C语言2-参数的传递与返回值

下面是call内部

push    ebp      mov     ebp,esp sub     esp,40h      以上三步都是为了提升堆栈,并且方便使用ebp寻址。并且esp在此时提升了 0x40,留下了 0x40大小的缓冲区

C语言2-参数的传递与返回值

push    ebx push    esi push    edi  以上三条目的是为了保存函数调用前的三个寄存器的值,方便函数结束后恢复原值 

C语言2-参数的传递与返回值

lea     edi,[ebp-40h]       执行后edi=刚刚提升堆栈时的esp mov     ecx,10h    mov     eax,0cccccccch rep stos    dword ptr [edi]  此步骤将缓冲区全部置CC  CC在硬编码中标志着中断 

C语言2-参数的传递与返回值

movsx   eax,word ptr [ebp+8] movsx   ecx,word ptr [ebp+0ch] add     eax,ecx movsx   edx,word ptr [ebp+10h] add     eax,edx movsx   ecx,word ptr [ebp+14h] add     eax,ecx   这里就是真正的计算过程 

堆栈没有变化

pop     edi pop     esi pop     ebx  恢复备份的三个寄存器 

C语言2-参数的传递与返回值

mov     esp,ebp pop     ebp ret  恢复堆栈

C语言2-参数的传递与返回值

出了call,在调用后执行的语句

恢复堆栈,返回调用地址  此时并没有平衡堆栈,据观察在调用后会使用 add esp,10h 恢复堆栈 

C语言2-参数的传递与返回值

此时,已恢复堆栈,但是堆栈上留下一堆垃圾信息,这些信息随时都可以被利用!

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2018年5月13日01:40:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   C语言2-参数的传递与返回值https://cn-sec.com/archives/51445.html

发表评论

匿名网友 填写信息