fini劫持

文章发布时间:

最后更新时间:

文章总字数:
413

预计阅读时间:
1 分钟

基础概念

1

一个程序在执行的时候 其并不是直接执行main函数

先是执行入口函数

入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量的构造等等

在完成初始化之后,调用main函数,正式开始执行函数主体部分

main函数执行完毕之后,返回到入口函数,入口函数进行清理工作,包括全局变量析构、堆销毁、关闭I/O等,然后进行系统调用结束进程

这里不具体到各个入口函数的区别 因为属于概念问题 理解起来不会有难度 可以自行查阅wiki

总之 如果只是为了做题而记忆 可以按下面理解

在静态编译下

bss段中会存放一个fini数组

在main函数结束后

程序指向了fini函数

其会先跳转到fini[1]存放的地址

接着返回fini[0]存放的地址

所以我们只需要将fini[1]修改为我们想要控制执行流的地方 再把fini[0]修改成fini函数

程序就会陷入死循环 重复的执行fini[1]指向的地址

动态编译下

2

fini数组不会存储在bss段中 并且也只有一个字长

(不知道是不是我遇到的这题的特殊情况)

直接将这个地址的值覆盖成要重复执行的函数地址就行了

不过在我遇到的这题中好像就只能跳转一次 不能理论无限执行