notepad

heap 里的main_arena

arena 是什么

main_arena

main_arena 是怎么泄露libc的基址的

在堆中的unsortedbin初始化时,双向链表的fd和bk都指向自身。而bin本身就在main_arena中。当有chunk被释放的时候,那么头部chunk的fd和尾部chunk的bk必定指向bin本身。那么只要将这个chunk非法打印出来并减去unsortedbinmain_arena中的偏移就可以得到main_arena的地址。

main_arena是libc中的常量,所以在获得了libc的情况下得到libc的加载基址。

fastbin是单链表没法做。

思路

这道题的基本流程是在chunk的开头放两个函数指针,然后通过用户输入来选择调用哪个函数。

但是并没有检查用户输入负数的情况。

开始本来是想分配3个chunk,利用漏洞free1,再正常释放0。

由于这两个chunk物理相邻,所以0和1可以被合并,更改原本1的内容作为0里面的函数的参数。

先打印一个got表的值,然后获得基址,最后用system就可以getshell

但是这里有一个问题,首先当然是glibc2.27的玄妙问题= =。其次是我在2.23的环境下面跑也会在进入printf这个函数返回的时候,显示can’t access memory call printf@plt的下一句代码地址。

暂时还不知道怎么解决这个问题。

所以问了师傅。

free1之后,更新0里面的函数地址就可以直接打印unsortedbin的地址也就可以得到main_arena

根据以上关于main_arena的内容正常流程写就可以了。

然而我又菜鸡了。怎么知道unsortedbinmain_arena的偏移呢。

64位下是0x58,32位下0x30 感谢izayoi

所以这个exp暂时还没写(我倒!)。