逆向调用函数与原函数地址探究

别来无恙 提交于 2020-02-17 01:49:20

最近逆向了一个普通的小程序,源程序如下
#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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!