在堆相关的题中经常需要泄露地址及最后的getshell,总结一下比较常用的方法:

Leak Address

heap base

  1. 最常用的即在存在UAF或溢出之类的条件下,因为fastbin 在内存中为单链存放,之后释放的fastbin范围的chunk的fd指针会指向之前释放的等大小范围的chunk,泄露fd指针即可得到heap base
  2. main arena中存放着top chunk的地址,如果有条件泄露其地址便可以得到heap base

libc base

  1. unsorted bin为双向链表,而第一个unsorted bin的fd 与 bk指针都指向main_arena+88 处,泄露指针处即可计算得到libc base

stack addr

  1. 一般在可以得到libc base的情况下,可以利用libc中存放的_environ指针,该指针指向栈中环境变量的位置,泄露该指针的值便可以得到栈地址

Get Shell

write to .plt.got

当程序保护中got表不满时 即 : RELRO: Partial RELRO 。此时got表可写,可以将某个函数的got地址改写为system()函数的地址,然后想办法将’/bin/sh’传参进去,get shell

write to malloc_hook or free_hook

malloc_hook && free_hook 是程序在调用malloc或free时会首先检查的地方,如果不为空,会先执行其指针指向的地方,所以如果将one_gadget或system(‘/bin/sh’)的地址写向该地址,便可以 get shell

write to stack

一般来说,这个真的是没有办法的话才用,利用上面的方法得到栈地址后,利用漏洞将one_gadget或system(‘/bin/sh’)的地址写向返回地址,这样程序在退出时便会getshell