0%

fini_array

0

什么是fini_array

fini_array被__libc_csu_fini调用的函数的指针数组.一般可以在ida中用shift+f7找到

一般来讲这个数组有两个数据,但也有特例(只有一个数据)

2

3

fini_array能干嘛

由图0可知,exit在执行时会调用这个指针,具体在exit-->__run_exit_handlers-->_dl_fini-->_dl_cal_fini里(下图是已经将fini_array的数据改为了main函数的地址)

1

4

利用思路

实现多次执行main

先来看静态链接的__libc_csu_fini函数代码(动态链接并没有这些指令)

5

由图可知,__libc_csu_fini在执行fini_array时先执行的fini_array[1],再执行的fini_array[0]

我们可以fini_array改为main函数来实现多次利用程序中漏洞的机会

也可以将fini_array[1]改为函数A,将fini_array[0]改为__libc_csu_fini 以实现死循环

构造栈迁移

通过上图还可以发现在0x968位置将一个地址赋给了ebp,这个地址就是我们的fini_array的地址

利用这一点我们可以先构造死循环利用程序的漏洞在指定位置写入ROP链,然后再通过将fini_array改为leave;ret;实现栈迁移执行布置好的ROP链

参考文章

详解64位静态编译程序的fini_array劫持及ROP攻击

劫持 64 位 fini_array 进行 ROP 攻击

和媳妇一起学Pwn 之 3x17