您的位置:首页 > 其它

栈帧分析

2016-04-05 21:11 274 查看
程序代码:

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函数,会重启电脑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  include system return