什么是fini_array
fini_array被__libc_csu_fini
调用的函数的指针数组.一般可以在ida中用shift+f7
找到
一般来讲这个数组有两个数据,但也有特例(只有一个数据)
fini_array能干嘛
由图0可知,exit在执行时会调用这个指针,具体在exit-->__run_exit_handlers-->_dl_fini-->_dl_cal_fini
里(下图是已经将fini_array的数据改为了main函数的地址)
利用思路
实现多次执行main
先来看静态链接的__libc_csu_fini
函数代码(动态链接并没有这些指令)
由图可知,__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链