TLDR
House of blindless 是一个涉及到 rtld 的利用方法,事实上 ld.so 里面确实还有很多被利用的潜力,后面涉及到 glibc 的比赛题目可能也会偏向于考察这部分内容。
直接以
WMCTF-2023-blindless
为例,附件链接:
Analysis
程序漏洞:
给了一个类似 bf 的 vm 程序,不过难得的逻辑很简单,可以实现在堆地址上加偏移的任意地址写,但是没有泄漏,这很明显需要某种 HOUSE 来打,这里考虑到 house of blindless
:
低字节覆盖 l->l_addr
和 l->l_info[DT_FINI_ARRAY/DT_FINI]->d_un.d_ptr
,即可调用 elf 中的任意函数,要求:
-
能够实现 elf 或 libc 范围内的任意地址写(本题可以分配大型堆块到 libc 前,进而实现 libc 范围内的任意写)
-
程序正常退出
参考到 ld.so 源码,elf/dl-fini.c 中的 _dl_fini() 函数中:
这里有两条分支,要劫持控制流就需要到达控制 l->l_info[26] == 0
绕过分支1,接下来分为能控制 elf+libc 和 仅能控制 libc 的两种情况:
控制 elf+libc:
由于能控制 elf,就可以改到 l→l_info[DT_FINI] 上具体的值,进而直接在 l_addr 的基础上进行任意 elf 地址调用。
若仅能控制 libc:
Exploitation
于是利用第二种思路得到本题 exp: