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

本文详细解析了逆向工程中对一个简单小程序的源代码进行分析的过程,特别是其加法函数的局部变量存储与调用机制。通过跟踪ESP寄存器的变化,观察局部变量在栈中的布局和函数调用的参数传递方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值