基础概念
一个程序在执行的时候 其并不是直接执行main函数
先是执行入口函数
入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量的构造等等
在完成初始化之后,调用main函数,正式开始执行函数主体部分
main函数执行完毕之后,返回到入口函数,入口函数进行清理工作,包括全局变量析构、堆销毁、关闭I/O等,然后进行系统调用结束进程
这里不具体到各个入口函数的区别 因为属于概念问题 理解起来不会有难度 可以自行查阅wiki
总之 如果只是为了做题而记忆 可以按下面理解
在静态编译下
bss段中会存放一个fini数组
在main函数结束后
程序指向了fini函数
其会先跳转到fini[1]存放的地址
接着返回fini[0]存放的地址
所以我们只需要将fini[1]修改为我们想要控制执行流的地方 再把fini[0]修改成fini函数
程序就会陷入死循环 重复的执行fini[1]指向的地址
动态编译下
fini数组不会存储在bss段中 并且也只有一个字长
(不知道是不是我遇到的这题的特殊情况)
直接将这个地址的值覆盖成要重复执行的函数地址就行了
不过在我遇到的这题中好像就只能跳转一次 不能理论无限执行