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
恢复堆栈
此时,已恢复堆栈,但是堆栈上留下一堆垃圾信息,这些信息随时都可以被利用!