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
,利用漏洞free
1,再正常释放0。
由于这两个chunk
物理相邻,所以0和1可以被合并,更改原本1的内容作为0里面的函数的参数。
先打印一个got表的值,然后获得基址,最后用system
就可以getshell
。
但是这里有一个问题,首先当然是glibc2.27的玄妙问题= =。其次是我在2.23的环境下面跑也会在进入printf
这个函数返回的时候,显示can’t access memory call printf@plt
的下一句代码地址。
暂时还不知道怎么解决这个问题。
所以问了师傅。
在free
1之后,更新0里面的函数地址就可以直接打印unsortedbin
的地址也就可以得到main_arena
。
根据以上关于main_arena
的内容正常流程写就可以了。
然而我又菜鸡了。怎么知道unsortedbin
和main_arena
的偏移呢。
64位下是
0x58
,32位下0x30
感谢izayoi
所以这个exp暂时还没写(我倒!)。