您的位置:首页 > 其它

栈帧

2016-06-11 13:34 429 查看
如图所示,下面是高地址,上面是低地址,main函数中调用fun1的时候,压入了实参a,b,这个实参a,b与main函数中的数据a,b是不样的,实参a,b是一份拷贝,在fun1函数
中,定义了指针p,p指向a的地址,这里a的地址是实参a的地址,p--指向main函数下一条命令的地址,*p=fun;将main函数下一条命令的地址改为了fun函数的地址,
故在程序运行的时候,main函数没有调用fun函数,而输出的结果是fun函数。

如图,为了改变b的值,可以利用p的地址,&p取得p的地址,*(int*)(&p+1)取得main函数ebp,将其强制类型转化为int *,(int *)(*(int *)(&p+1)),再找到b的地址
(int *)(*(int *)(&p+1))-1;解引用取得b的值*((int *)(*(int *)(&p+1))-1),最后可以赋值进而改变b的值。




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  程序 如图所示