最近逆向了一个普通的小程序,源程序如下
#include <stdio.h>
long add(long a,long b)
{
long x = a,y = b;
return (x+y);
}
int main(int argc,char* argv[])
{
long a = 1, b = 2;
printf("%d\n",add(a,b));
return 0;
}
刚进入局部函数的时候
内存中的数据如下:此时栈顶esp = 0019ff14h,可以看出现在栈中存放的三个数为两个局部变量0000 0001与0000 0002以及main函数的地址0040 1041(这三个数前面的内存存放的内容为x与y的局部变量0000 0002与0000 0001
运行到mov eax,dword ptr ss:[ebp-4],ecx后
此时esp = 0019ff08,内存中的数据为
可以看出栈中从栈顶到栈底存放的数据为0000 0001,0000 0002,0019 ff28(压入的ebp寄存器),0040 1041(main函数的地址),0000 0001,0000 0002
(ebp = 0019 ff10始终指向0019 ff28后面的位置,红笔标注出来的为ebp寄存器指向 的位置)
左边的箭头将ebp+C挪移到ebp-4,右边的箭头将ebp+8挪移到ebp-8
运算完后和的值存储在eax之中,eax = 3
运行完局部函数后程序进入main函数
压栈之前
esp = 0019ff20,push eax之后
可以看出原先传递局部变量的0000 0001与0000 0002值所在空间不再需要,将0000 0002的值改为0000 0003
来源:CSDN
作者:白袍侠客
链接:https://blog.csdn.net/znevegiveup1/article/details/104342123