#include
#include
void bug(){        system("reboot\n");        exit(0);}int stack_test(int a,int b){        printf("before write:0x%x\n",b);        int *p=&a;        p++;        *p=0xdddd;        printf("after write:0x%x\n",b);        int c=0xcccc;        return c;}int main(){        int a=0xaaaa;        int b=0xbbbb;        int ret=stack_test(a,b);        printf("you should run here\n");        return 0;}

运行结果:

before write:0xbbbb

after write:0xdddd

you should run here

分析:函数参数压栈从右至左进行,先输出b的地址,后p指向a的地址,p++后再指向b所在的那块空间,在进行解引用修改其内容,即修改了b的地址。

#include
#include
void bug(){        system("reboot");        exit(0);}int stack_test(int a,int b){        int *p=&a;        p--;        *p=bug;//      printf("before write:0x%x\n",b);//      int *p=&a;//      p++;//      *p=0xdddd;//      printf("after write:0x%x\n",b);        int c=0xcccc;        return c;}int main(){        int a=0xaaaa;        int b=0xbbbb;        int ret=stack_test(a,b);        printf("you should run here\n");        return 0;}

运行结果:系统重启

分析:p指向a所在的内存空间,再让p--,解引用改变其内容。