程序代码: 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void bug() 5 { 6 system("reboot"); 7 exit(0); 8 9 } 10 int stack_test(int a,int b) 11 { 12 //int *p=&a; 13 //p--; 14 //*p=bug; 15 printf("before write : 0x%x\n",b); 16 int *p=&a; 17 p++; 18 *p=0xdddd; 19 printf("after write : 0x%x\n",b); 20 int c=0xcccc; 21 return c; 22 23 } 运行结果: before write :0xbbbb; after write:0xdddd;
分析结果:
因为栈是向下生长的并且由高地址向低地址,函数调用时参数从右向左压栈,
当第一次取b的地址时还是原来的,当指针p取到a的地址并向后加时,已经指向b,此时*p 改变b的地址
,所以after之后的地址为0xdddd。
如果放开注释过的内容,p--之后指向返回地址,将bug函数地址存入返回地址处,因此跳转到bug函数,会重启电脑。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。