栈帧分析
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函数,会重启电脑。
相关文章推荐
- Windows7下获得System权限问题解决方法
- Ruby中require、load、include、extend的区别介绍
- 安装软件 Nullsoft Install System 2.27汉化版 下载
- vbscript include的办法实现代码第1/2页
- 解析C++编程中的#include和条件编译
- PHP脚本中include文件出错解决方法
- Could not load type System.ServiceModel.Activation.HttpModule解决办法
- PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
- Flex include和import ActionScript代码
- PHP中return 和 exit 、break和contiue 区别与用法
- set_include_path在win和linux下的区别
- php include加载文件两种方式效率比较
- How to Auto Include a Javascript File
- 浅析return false的正确使用
- javascript中return,return true,return false三者的用法及区别
- 浅谈ASP.NET的include的使用方法
- 学习jQuey中的return false
- oracle忘记sys/system/scott用户密码的解决方法
- java/jsp中 中文问题详解
- php相对当前文件include其它文件的方法