首页
社区
课程
招聘
通过dlopen函数打开136字节大小的so文件可以将藏匿于程序头表的汇编指令运行,这是如何做到的。
白露降 2022-12-31 1337

在学习复现某个漏洞的时候,查阅到了分析文章,该文章地址为该漏洞的分析文章。在作者进行漏洞利用时,构造了如下的.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文件就可以运行这段汇编指令呢?

收藏
2条回答
mb_jsalosiw 2022-12-31 2022-12-31编辑

也许是这个
像win的DllMain一样(?
https://www.cnblogs.com/D3Hunter/p/3175770.html#:~:text=DllMain%E5%8F%AF%E4%BB%A5%E5%9C%A8dll%E5%8A%A0%E8%BD%BD%E5%88%B0%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B%E6%97%B6%E8%B0%83%E7%94%A8%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%81%9A%E4%BA%9B%E5%88%9D%E5%A7%8B%E5%8C%96%E3%80%81%E6%B8%85%E7%90%86%E7%9A%84%E5%B7%A5%E4%BD%9C%20%E4%BD%86%E5%9C%A8linux%E4%B8%8A%E6%B2%A1%E6%9C%89%E4%B8%93%E9%97%A8%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%8C%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8gcc%E6%89%A9%E5%BC%A0%E5%B1%9E%E6%80%A7%20__attribute__,%28%28constructor%29%29%20and%20__attribute__%20%28%28destructor%29%29%E6%9D%A5%E5%AE%9E%E7%8E%B0
问就是MAGIC

回复
白露降: 这个是echo指令直接写入空白文件的,没有经过编译,而且是畸形的elf文件。
回复 2022-12-31
白露降 2023-1-3

https://www.int80.top/23-1-2/
通过调试分析dlopen源码已经解决该问题,分析过程分享在上面的博客上了

回复