利用场景

关键词:大堆块,RELRO半开/不开,dl_fixup

针对在libc上方申请出来的大堆块,当出现堆溢出/UAF等问题的时候,如果能够修改到chunk的size位,通过扩大size,覆盖掉libc.so的第一个可读段的一部分,这一部分都是与动态链接有关,从而可以挟持基于No RELROPartial RELRO 的程序的dl_fixup 中从libc里面获取符号地址的过程。

原理

正如上面所说,通过malloc大堆块,大堆块会申请到libc上方,此时修改掉这个大堆块的size,再释放掉这个chunk,那就会修改掉一部分的libc.so.6的可写权限。

image.png

此时动态链接延迟绑定未定位的符号就会去访问这部分的数据

这里重点看相关的代码:查询符号函数do_lookup_x

image.png

从简单地说,这个函数回去访问所有link_map对应的符号表,尝试去寻找这个函数,当然这里也包括我们覆盖掉的那一部分。

我们在里面覆盖掉了strtab 以及symtab ,还有其他函数哈希/验证有关的东西

主要关注五个数据,在利用的时候要进行修复,修复完再小改一下(st_name)就可以了

image.png

总共五个数据,先运行一遍正常的延迟绑定获取对应的值,之后再复刻一份就好

可以细细调试一遍,以GLIBC 2.31-0ubuntu9.16 的exit函数举例