程序代码:
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函数,会重启电脑。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。