通过dlopen函数打开136字节大小的so文件可以将藏匿于程序头表的汇编指令运行,这是如何做到的。
在学习复现某个漏洞的时候,查阅到了分析文章,该文章地址为该漏洞的分析文章。在作者进行漏洞利用时,构造了如下的.so文件。
白色框框住的二进制数据就是如下图的汇编指令
汇编指令的意思就是利用execve系统调用运行了/tmp/hax脚本。
当我通过dlopen函数与openssl的engine参数加载该.so文件时,该.so文件都能被运行,且无报错,如下图所示。
其中runlib程序代码,以及/tmp/hax脚本内容如下图所示
openssl的engine参数最后也是运行了dlopen。
那么问题就是,为什么dlopen可以运行这个.so的这段汇编指令,dlopen打开.so文件不应该只能运行.init段的代码吗?
我简略分析了一下dlopen的源码,也仅仅是打开.so文件读取ELF头数据进行比对,然后将程序段载入内存,并无直接执行指令的代码。
同时,该.so文件数据的入口地址为0x2,图1白框的汇编指令位于第一个Dynamic类型的程序头处,该程序头的记录该程序头的地址为0x58,好像怎么样都不会执行到这段汇编指令啊。
该程序头的各项数据如下图所示
那么请问为什么通过dlopen打开该.so文件就可以运行这段汇编指令呢?