如图所示,下面是高地址,上面是低地址,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的值。

栈帧_程序

栈帧_如图所示_02