关键词:大堆块,RELRO半开/不开,dl_fixup
针对在libc上方申请出来的大堆块,当出现堆溢出/UAF等问题的时候,如果能够修改到chunk的size位,通过扩大size,覆盖掉libc.so的第一个可读段的一部分,这一部分都是与动态链接有关,从而可以挟持基于No RELRO
或Partial RELRO
的程序的dl_fixup
中从libc里面获取符号地址的过程。
正如上面所说,通过malloc大堆块,大堆块会申请到libc上方,此时修改掉这个大堆块的size,再释放掉这个chunk,那就会修改掉一部分的libc.so.6的可写权限。
此时动态链接延迟绑定未定位的符号就会去访问这部分的数据
这里重点看相关的代码:查询符号函数do_lookup_x
从简单地说,这个函数回去访问所有link_map对应的符号表,尝试去寻找这个函数,当然这里也包括我们覆盖掉的那一部分。
我们在里面覆盖掉了strtab
以及symtab
,还有其他函数哈希/验证有关的东西
主要关注五个数据,在利用的时候要进行修复,修复完再小改一下(st_name)就可以了
总共五个数据,先运行一遍正常的延迟绑定获取对应的值,之后再复刻一份就好
可以细细调试一遍,以GLIBC 2.31-0ubuntu9.16
的exit函数举例