栈帧的不安全程序示例
栈帧简述
堆栈(stack):c语言程序运行时必须有的记录调用记录和参数的空间。
保存项:
函数调哟能框架
参数传递
返回值保存
提供局部变量
一个老司机通过改变栈帧进行开车的故事
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> void Exit() { printf("i am a big bug,老司机\n"); ///老司机调用shell命令开车 //其实这里可以做的事情反而有很多种,比如 //对用户隐私文件读取,并且在网络上发送。 //修改系统哦你配置等,搞蹦系统,删除文件,等等 system("sl"); exit(10010); } void func(int x,int y) { int * p = &x; --p; printf("int Func\n"); //核心动作就是这里,通过修改栈帧中保存返回值的位置,使得函数不是正常返回,而是进入老司机的工作位置。 *p = Exit; } int main() { func(a,b); ///程序并没有进行到这里 printf("after func()\n"); return 0; }