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
下面是call内部
push ebp mov ebp,esp sub esp,40h 以上三步都是为了提升堆栈,并且方便使用ebp寻址。并且esp在此时提升了 0x40,留下了 0x40大小的缓冲区
push ebx push esi push edi 以上三条目的是为了保存函数调用前的三个寄存器的值,方便函数结束后恢复原值
lea edi,[ebp-40h] 执行后edi=刚刚提升堆栈时的esp mov ecx,10h mov eax,0cccccccch rep stos dword ptr [edi] 此步骤将缓冲区全部置CC CC在硬编码中标志着中断
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 恢复备份的三个寄存器
mov esp,ebp pop ebp ret 恢复堆栈
出了call,在调用后执行的语句
恢复堆栈,返回调用地址 此时并没有平衡堆栈,据观察在调用后会使用 add esp,10h 恢复堆栈
此时,已恢复堆栈,但是堆栈上留下一堆垃圾信息,这些信息随时都可以被利用!
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论