heap 里的main_arena
arena 是什么
main_arena
main_arena 是怎么泄露libc的基址的
在堆中的unsortedbin初始化时,双向链表的fd和bk都指向自身。而bin本身就在main_arena中。当有chunk被释放的时候,那么头部chunk的fd和尾部chunk的bk必定指向bin本身。那么只要将这个chunk非法打印出来并减去unsortedbin在main_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的内容正常流程写就可以了。
然而我又菜鸡了。怎么知道unsortedbin和main_arena的偏移呢。
64位下是
0x58,32位下0x30感谢izayoi
所以这个exp暂时还没写(我倒!)。