TLDR;
House of blindless 是一个涉及到 rtld 的利用方法,事实上 ld.so 里面确实还有很多被利用的潜力,后面涉及到 glibc 的比赛题目可能也会偏向于考察这部分内容。
直接以 WMCTF-2023-blindless
为例,附件链接:
attachment
Analysis
程序漏洞:
给了一个类似 bf 的 vm 程序,不过难得的逻辑很简单,可以实现在堆地址上加偏移的任意地址写,但是没有泄漏,这很明显需要某种 HOUSE 来打,这里考虑到 house of blindless
:
低字节覆盖 l->l_addr
和 l->l_info[DT_FINI_ARRAY/DT_FINI]->d_un.d_ptr
,即可调用 elf 中的任意函数,要求:
参考到 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: