rex-arch 0.1.17 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rex/arch/aarch64.rb +60 -0
- data/lib/rex/arch/amd64.rb +43 -0
- data/lib/rex/arch/arm.rb +43 -0
- data/lib/rex/arch/loongarch64.rb +59 -0
- data/lib/rex/arch/mips32.rb +59 -0
- data/lib/rex/arch/mips64.rb +59 -0
- data/lib/rex/arch/ppc32.rb +59 -0
- data/lib/rex/arch/ppc64.rb +59 -0
- data/lib/rex/arch/riscv32.rb +59 -0
- data/lib/rex/arch/riscv64.rb +59 -0
- data/lib/rex/arch/version.rb +1 -1
- data/lib/rex/arch/zarch.rb +36 -10
- data/lib/rex/arch.rb +12 -1
- metadata +17 -33
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 201b0697dc0505159d684431af62c3596829f8fb5210df2abdee9c3da7ee26f9
|
|
4
|
+
data.tar.gz: 43fa120c8cd3a2b3b5068c413d96100ae843eee75195e97f35bd8591246f1c51
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8f5767e6b29b85abc0455cf6d2d094093a30d8fd511fcf9a41a8376db3501b2b3ffc14e6674974a1872d893832fb48db82a51785ef0b336b27a21b96e9c84b98
|
|
7
|
+
data.tar.gz: 1fd5a7067140dcc6b9316ca1ca322d496581601ba30b4635ec60acbd8cbdec4fc0611b6eb4d7ecb18d35b6556770e340dbc6216b08cf61b7010676bf0fe31fb9
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# AArch64 64-bit
|
|
7
|
+
#
|
|
8
|
+
module AArch64
|
|
9
|
+
# Register number constants
|
|
10
|
+
X0 = W0 = 0 # function arg / return value
|
|
11
|
+
X1 = W1 = 1 # function arg / return value
|
|
12
|
+
X2 = W2 = 2 # function arg
|
|
13
|
+
X3 = W3 = 3 # function arg
|
|
14
|
+
X4 = W4 = 4 # function arg
|
|
15
|
+
X5 = W5 = 5 # function arg
|
|
16
|
+
X6 = W6 = 6 # function arg
|
|
17
|
+
X7 = W7 = 7 # function arg
|
|
18
|
+
X8 = W8 = 8 # indirect result location (a.k.a. "indirect result" / sometimes "XR")
|
|
19
|
+
X9 = W9 = 9 # temporary
|
|
20
|
+
X10 = W10 = 10 # temporary
|
|
21
|
+
X11 = W11 = 11 # temporary
|
|
22
|
+
X12 = W12 = 12 # temporary
|
|
23
|
+
X13 = W13 = 13 # temporary
|
|
24
|
+
X14 = W14 = 14 # temporary
|
|
25
|
+
X15 = W15 = 15 # temporary
|
|
26
|
+
X16 = W16 = 16 # intra-procedure call scratch (IP0)
|
|
27
|
+
X17 = W17 = 17 # intra-procedure call scratch (IP1)
|
|
28
|
+
X18 = W18 = 18 # platform register (reserved by OS)
|
|
29
|
+
X19 = W19 = 19 # callee-saved
|
|
30
|
+
X20 = W20 = 20 # callee-saved
|
|
31
|
+
X21 = W21 = 21 # callee-saved
|
|
32
|
+
X22 = W22 = 22 # callee-saved
|
|
33
|
+
X23 = W23 = 23 # callee-saved
|
|
34
|
+
X24 = W24 = 24 # callee-saved
|
|
35
|
+
X25 = W25 = 25 # callee-saved
|
|
36
|
+
X26 = W26 = 26 # callee-saved
|
|
37
|
+
X27 = W27 = 27 # callee-saved
|
|
38
|
+
X28 = W28 = 28 # callee-saved
|
|
39
|
+
X29 = W29 = FP = 29 # frame pointer
|
|
40
|
+
X30 = W30 = LR = 30 # link register (return address)
|
|
41
|
+
SP = 31 # stack pointer (shares encoding with XZR/WZR)
|
|
42
|
+
XZR = WZR = 31 # zero register (reads as 0, writes ignored)
|
|
43
|
+
|
|
44
|
+
# @return the number associated with a named register
|
|
45
|
+
def self.reg_number(str)
|
|
46
|
+
const_get(str.upcase)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Check if a provided number represents a valid register
|
|
50
|
+
# @return [Boolean]
|
|
51
|
+
def self._check_reg(*regs)
|
|
52
|
+
regs.each do |reg|
|
|
53
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 31 || reg < 0
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
nil
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# AMD64 (x86_64) 64-bit
|
|
7
|
+
#
|
|
8
|
+
module AMD64
|
|
9
|
+
# Register number constants
|
|
10
|
+
RAX = EAX = AX = AH = AL = 0 # accumulator
|
|
11
|
+
RBX = EBX = BX = BH = BL = 1 # base
|
|
12
|
+
RCX = ECX = CX = CH = CL = 2 # counter
|
|
13
|
+
RDX = EDX = DX = DH = DL = 3 # data
|
|
14
|
+
RSI = ESI = SI = 4 # source index
|
|
15
|
+
RDI = EDI = DI = 5 # destination index
|
|
16
|
+
RBP = EBP = BP = 6 # base pointer
|
|
17
|
+
RSP = ESP = SP = 7 # stack pointer
|
|
18
|
+
R8 = R8D = R8W = R8B = 8 # extended register
|
|
19
|
+
R9 = R9D = R9W = R9B = 9
|
|
20
|
+
R10 = R10D = R10W = R10B = 10
|
|
21
|
+
R11 = R11D = R11W = R11B = 11
|
|
22
|
+
R12 = R12D = R12W = R12B = 12
|
|
23
|
+
R13 = R13D = R13W = R13B = 13
|
|
24
|
+
R14 = R14D = R14W = R14B = 14
|
|
25
|
+
R15 = R15D = R15W = R15B = 15
|
|
26
|
+
|
|
27
|
+
# @return the number associated with a named register
|
|
28
|
+
def self.reg_number(str)
|
|
29
|
+
const_get(str.upcase)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Check if a provided number represents a valid register
|
|
33
|
+
# @return [Boolean]
|
|
34
|
+
def self._check_reg(*regs)
|
|
35
|
+
regs.each do |reg|
|
|
36
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 15 || reg < 0
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
nil
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
data/lib/rex/arch/arm.rb
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# ARM 32-bit
|
|
7
|
+
#
|
|
8
|
+
module ARM
|
|
9
|
+
# Register number constants
|
|
10
|
+
R0 = A1 = 0 # function argument / return value
|
|
11
|
+
R1 = A2 = 1 # function argument
|
|
12
|
+
R2 = A3 = 2 # function argument
|
|
13
|
+
R3 = A4 = 3 # function argument
|
|
14
|
+
R4 = V1 = 4 # variable / callee-saved
|
|
15
|
+
R5 = V2 = 5 # variable / callee-saved
|
|
16
|
+
R6 = V3 = 6 # variable / callee-saved
|
|
17
|
+
R7 = V4 = 7 # variable / callee-saved
|
|
18
|
+
R8 = V5 = 8 # variable / callee-saved
|
|
19
|
+
R9 = V6 = SB = 9 # static base / callee-saved
|
|
20
|
+
R10 = V7 = SL = 10 # stack limit / callee-saved
|
|
21
|
+
R11 = V8 = FP = 11 # frame pointer
|
|
22
|
+
R12 = IP = 12 # intra-procedure scratch
|
|
23
|
+
R13 = SP = 13 # stack pointer
|
|
24
|
+
R14 = LR = 14 # link register (return address)
|
|
25
|
+
R15 = PC = 15 # program counter
|
|
26
|
+
|
|
27
|
+
# @return the number associated with a named register
|
|
28
|
+
def self.reg_number(str)
|
|
29
|
+
const_get(str.upcase)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Check if a provided number represents a valid register
|
|
33
|
+
# @return [Boolean]
|
|
34
|
+
def self._check_reg(*regs)
|
|
35
|
+
regs.each do |reg|
|
|
36
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 15 || reg < 0
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
nil
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# LoongArch64 64-bit
|
|
7
|
+
#
|
|
8
|
+
module LoongArch64
|
|
9
|
+
# Register number constants
|
|
10
|
+
R0 = ZERO = 0 # constant 0 (hardwired zero)
|
|
11
|
+
R1 = RA = 1 # return address
|
|
12
|
+
R2 = SP = 2 # stack pointer
|
|
13
|
+
R3 = GP = 3 # global pointer
|
|
14
|
+
R4 = TP = 4 # thread pointer
|
|
15
|
+
R5 = T0 = 5 # temporary
|
|
16
|
+
R6 = T1 = 6 # temporary
|
|
17
|
+
R7 = T2 = 7 # temporary
|
|
18
|
+
R8 = T3 = 8 # temporary
|
|
19
|
+
R9 = T4 = 9 # temporary
|
|
20
|
+
R10 = T5 = 10 # temporary
|
|
21
|
+
R11 = T6 = 11 # temporary
|
|
22
|
+
R12 = T7 = 12 # temporary
|
|
23
|
+
R13 = T8 = 13 # temporary
|
|
24
|
+
R14 = T9 = 14 # temporary
|
|
25
|
+
R15 = T10 = 15 # temporary
|
|
26
|
+
R16 = T11 = 16 # temporary
|
|
27
|
+
R17 = T12 = 17 # temporary
|
|
28
|
+
R18 = T13 = 18 # temporary
|
|
29
|
+
R19 = T14 = 19 # temporary
|
|
30
|
+
R20 = T15 = 20 # temporary
|
|
31
|
+
R21 = T16 = 21 # temporary
|
|
32
|
+
R22 = T17 = 22 # temporary
|
|
33
|
+
R23 = T18 = 23 # temporary
|
|
34
|
+
R24 = T19 = 24 # temporary
|
|
35
|
+
R25 = T20 = 25 # temporary
|
|
36
|
+
R26 = T21 = 26 # temporary
|
|
37
|
+
R27 = T22 = 27 # temporary
|
|
38
|
+
R28 = T23 = 28 # temporary
|
|
39
|
+
R29 = FP = 29 # frame pointer
|
|
40
|
+
R30 = S0 = 30 # saved register
|
|
41
|
+
R31 = S1 = 31 # saved register
|
|
42
|
+
|
|
43
|
+
# @return the number associated with a named register.
|
|
44
|
+
def self.reg_number(str)
|
|
45
|
+
const_get(str.upcase)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if a provided number represents a valid register
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def self._check_reg(*regs)
|
|
51
|
+
regs.each do |reg|
|
|
52
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 31 || reg < 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# MIPS 32-bit
|
|
7
|
+
#
|
|
8
|
+
module MIPS32
|
|
9
|
+
# Register number constants
|
|
10
|
+
R0 = ZERO = 0 # constant 0
|
|
11
|
+
R1 = AT = 1 # assembler temporary
|
|
12
|
+
R2 = V0 = 2 # function return value
|
|
13
|
+
R3 = V1 = 3 # function return value
|
|
14
|
+
R4 = A0 = 4 # argument
|
|
15
|
+
R5 = A1 = 5 # argument
|
|
16
|
+
R6 = A2 = 6 # argument
|
|
17
|
+
R7 = A3 = 7 # argument
|
|
18
|
+
R8 = T0 = 8 # temporary
|
|
19
|
+
R9 = T1 = 9 # temporary
|
|
20
|
+
R10 = T2 = 10 # temporary
|
|
21
|
+
R11 = T3 = 11 # temporary
|
|
22
|
+
R12 = T4 = 12 # temporary
|
|
23
|
+
R13 = T5 = 13 # temporary
|
|
24
|
+
R14 = T6 = 14 # temporary
|
|
25
|
+
R15 = T7 = 15 # temporary
|
|
26
|
+
R16 = S0 = 16 # saved register
|
|
27
|
+
R17 = S1 = 17 # saved register
|
|
28
|
+
R18 = S2 = 18 # saved register
|
|
29
|
+
R19 = S3 = 19 # saved register
|
|
30
|
+
R20 = S4 = 20 # saved register
|
|
31
|
+
R21 = S5 = 21 # saved register
|
|
32
|
+
R22 = S6 = 22 # saved register
|
|
33
|
+
R23 = S7 = 23 # saved register
|
|
34
|
+
R24 = T8 = 24 # temporary
|
|
35
|
+
R25 = T9 = 25 # temporary
|
|
36
|
+
R26 = K0 = 26 # reserved for OS
|
|
37
|
+
R27 = K1 = 27 # reserved for OS
|
|
38
|
+
R28 = GP = 28 # global pointer
|
|
39
|
+
R29 = SP = 29 # stack pointer
|
|
40
|
+
R30 = FP = S8 = 30 # frame pointer / saved
|
|
41
|
+
R31 = RA = 31 # return address
|
|
42
|
+
|
|
43
|
+
# @return the number associated with a named register
|
|
44
|
+
def self.reg_number(str)
|
|
45
|
+
const_get(str.upcase)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if a provided number represents a valid register
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def self._check_reg(*regs)
|
|
51
|
+
regs.each do |reg|
|
|
52
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 31 || reg < 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# MIPS 64-bit
|
|
7
|
+
#
|
|
8
|
+
module MIPS64
|
|
9
|
+
# Register number constants
|
|
10
|
+
R0 = ZERO = 0 # constant 0
|
|
11
|
+
R1 = AT = 1 # assembler temporary
|
|
12
|
+
R2 = V0 = 2 # function return value
|
|
13
|
+
R3 = V1 = 3 # function return value
|
|
14
|
+
R4 = A0 = 4 # argument
|
|
15
|
+
R5 = A1 = 5 # argument
|
|
16
|
+
R6 = A2 = 6 # argument
|
|
17
|
+
R7 = A3 = 7 # argument
|
|
18
|
+
R8 = T0 = 8 # temporary
|
|
19
|
+
R9 = T1 = 9 # temporary
|
|
20
|
+
R10 = T2 = 10 # temporary
|
|
21
|
+
R11 = T3 = 11 # temporary
|
|
22
|
+
R12 = T4 = 12 # temporary
|
|
23
|
+
R13 = T5 = 13 # temporary
|
|
24
|
+
R14 = T6 = 14 # temporary
|
|
25
|
+
R15 = T7 = 15 # temporary
|
|
26
|
+
R16 = S0 = 16 # saved register
|
|
27
|
+
R17 = S1 = 17 # saved register
|
|
28
|
+
R18 = S2 = 18 # saved register
|
|
29
|
+
R19 = S3 = 19 # saved register
|
|
30
|
+
R20 = S4 = 20 # saved register
|
|
31
|
+
R21 = S5 = 21 # saved register
|
|
32
|
+
R22 = S6 = 22 # saved register
|
|
33
|
+
R23 = S7 = 23 # saved register
|
|
34
|
+
R24 = T8 = 24 # temporary
|
|
35
|
+
R25 = T9 = 25 # temporary
|
|
36
|
+
R26 = K0 = 26 # reserved for OS
|
|
37
|
+
R27 = K1 = 27 # reserved for OS
|
|
38
|
+
R28 = GP = 28 # global pointer
|
|
39
|
+
R29 = SP = 29 # stack pointer
|
|
40
|
+
R30 = FP = S8 = 30 # frame pointer / saved
|
|
41
|
+
R31 = RA = 31 # return address
|
|
42
|
+
|
|
43
|
+
# @return the number associated with a named register
|
|
44
|
+
def self.reg_number(str)
|
|
45
|
+
const_get(str.upcase)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if a provided number represents a valid register
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def self._check_reg(*regs)
|
|
51
|
+
regs.each do |reg|
|
|
52
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 31 || reg < 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# PPC 32-bit
|
|
7
|
+
#
|
|
8
|
+
module PPC32
|
|
9
|
+
# Register number constants
|
|
10
|
+
R0 = 0 # scratch / special
|
|
11
|
+
R1 = SP = 1 # stack pointer
|
|
12
|
+
R2 = TOC = 2 # table of contents / global pointer
|
|
13
|
+
R3 = 3 # function argument / return value
|
|
14
|
+
R4 = 4 # function argument
|
|
15
|
+
R5 = 5 # function argument
|
|
16
|
+
R6 = 6 # function argument
|
|
17
|
+
R7 = 7 # function argument
|
|
18
|
+
R8 = 8 # function argument
|
|
19
|
+
R9 = 9 # function argument
|
|
20
|
+
R10 = 10 # function argument
|
|
21
|
+
R11 = 11 # temporary
|
|
22
|
+
R12 = 12 # temporary
|
|
23
|
+
R13 = 13 # small data area pointer
|
|
24
|
+
R14 = 14 # callee-saved
|
|
25
|
+
R15 = 15 # callee-saved
|
|
26
|
+
R16 = 16 # callee-saved
|
|
27
|
+
R17 = 17 # callee-saved
|
|
28
|
+
R18 = 18 # callee-saved
|
|
29
|
+
R19 = 19 # callee-saved
|
|
30
|
+
R20 = 20 # callee-saved
|
|
31
|
+
R21 = 21 # callee-saved
|
|
32
|
+
R22 = 22 # callee-saved
|
|
33
|
+
R23 = 23 # callee-saved
|
|
34
|
+
R24 = 24 # callee-saved
|
|
35
|
+
R25 = 25 # callee-saved
|
|
36
|
+
R26 = 26 # callee-saved
|
|
37
|
+
R27 = 27 # callee-saved
|
|
38
|
+
R28 = 28 # callee-saved
|
|
39
|
+
R29 = 29 # callee-saved
|
|
40
|
+
R30 = 30 # callee-saved
|
|
41
|
+
R31 = 31 # callee-saved
|
|
42
|
+
|
|
43
|
+
# @return the number associated with a named register
|
|
44
|
+
def self.reg_number(str)
|
|
45
|
+
const_get(str.upcase)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if a provided number represents a valid register
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def self._check_reg(*regs)
|
|
51
|
+
regs.each do |reg|
|
|
52
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 31 || reg < 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# PPC 64-bit
|
|
7
|
+
#
|
|
8
|
+
module PPC64
|
|
9
|
+
# Register number constants
|
|
10
|
+
R0 = 0 # scratch / special
|
|
11
|
+
R1 = SP = 1 # stack pointer
|
|
12
|
+
R2 = TOC = 2 # table of contents / global pointer
|
|
13
|
+
R3 = 3 # function argument / return value
|
|
14
|
+
R4 = 4 # function argument
|
|
15
|
+
R5 = 5 # function argument
|
|
16
|
+
R6 = 6 # function argument
|
|
17
|
+
R7 = 7 # function argument
|
|
18
|
+
R8 = 8 # function argument
|
|
19
|
+
R9 = 9 # function argument
|
|
20
|
+
R10 = 10 # function argument
|
|
21
|
+
R11 = 11 # temporary
|
|
22
|
+
R12 = 12 # temporary
|
|
23
|
+
R13 = 13 # small data area pointer
|
|
24
|
+
R14 = 14 # callee-saved
|
|
25
|
+
R15 = 15 # callee-saved
|
|
26
|
+
R16 = 16 # callee-saved
|
|
27
|
+
R17 = 17 # callee-saved
|
|
28
|
+
R18 = 18 # callee-saved
|
|
29
|
+
R19 = 19 # callee-saved
|
|
30
|
+
R20 = 20 # callee-saved
|
|
31
|
+
R21 = 21 # callee-saved
|
|
32
|
+
R22 = 22 # callee-saved
|
|
33
|
+
R23 = 23 # callee-saved
|
|
34
|
+
R24 = 24 # callee-saved
|
|
35
|
+
R25 = 25 # callee-saved
|
|
36
|
+
R26 = 26 # callee-saved
|
|
37
|
+
R27 = 27 # callee-saved
|
|
38
|
+
R28 = 28 # callee-saved
|
|
39
|
+
R29 = 29 # callee-saved
|
|
40
|
+
R30 = 30 # callee-saved
|
|
41
|
+
R31 = 31 # callee-saved
|
|
42
|
+
|
|
43
|
+
# @return the number associated with a named register
|
|
44
|
+
def self.reg_number(str)
|
|
45
|
+
const_get(str.upcase)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if a provided number represents a valid register
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def self._check_reg(*regs)
|
|
51
|
+
regs.each do |reg|
|
|
52
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 31 || reg < 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# RISC-V 32-bit
|
|
7
|
+
#
|
|
8
|
+
module RISCV32
|
|
9
|
+
# Register number constants
|
|
10
|
+
ZERO = X0 = 0 # constant 0
|
|
11
|
+
RA = X1 = 1 # return address
|
|
12
|
+
SP = X2 = 2 # stack pointer
|
|
13
|
+
GP = X3 = 3 # global pointer
|
|
14
|
+
TP = X4 = 4 # thread pointer
|
|
15
|
+
T0 = X5 = 5 # temporary register 0
|
|
16
|
+
T1 = X6 = 6 # temporary register 1
|
|
17
|
+
T2 = X7 = 7 # temporary register 2
|
|
18
|
+
S0 = FP = X8 = 8 # saved register / frame pointer
|
|
19
|
+
S1 = X9 = 9 # saved register
|
|
20
|
+
A0 = X10 = 10 # arg / return value
|
|
21
|
+
A1 = X11 = 11 # arg / return value
|
|
22
|
+
A2 = X12 = 12 # arg
|
|
23
|
+
A3 = X13 = 13 # arg
|
|
24
|
+
A4 = X14 = 14 # arg
|
|
25
|
+
A5 = X15 = 15 # arg
|
|
26
|
+
A6 = X16 = 16 # arg
|
|
27
|
+
A7 = X17 = 17 # arg
|
|
28
|
+
S2 = X18 = 18 # saved register
|
|
29
|
+
S3 = X19 = 19 # saved register
|
|
30
|
+
S4 = X20 = 20 # saved register
|
|
31
|
+
S5 = X21 = 21 # saved register
|
|
32
|
+
S6 = X22 = 22 # saved register
|
|
33
|
+
S7 = X23 = 23 # saved register
|
|
34
|
+
S8 = X24 = 24 # saved register
|
|
35
|
+
S9 = X25 = 25 # saved register
|
|
36
|
+
S10 = X26 = 26 # saved register
|
|
37
|
+
S11 = X27 = 27 # saved register
|
|
38
|
+
T3 = X28 = 28 # temporary register
|
|
39
|
+
T4 = X29 = 29 # temporary register
|
|
40
|
+
T5 = X30 = 30 # temporary register
|
|
41
|
+
T6 = X31 = 31 # temporary register
|
|
42
|
+
|
|
43
|
+
# @return the number associated with a named register.
|
|
44
|
+
def self.reg_number(str)
|
|
45
|
+
const_get(str.upcase)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if a provided number represents a valid register
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def self._check_reg(*regs)
|
|
51
|
+
regs.each do |reg|
|
|
52
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 31 || reg < 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# RISC-V 64-bit
|
|
7
|
+
#
|
|
8
|
+
module RISCV64
|
|
9
|
+
# Register number constants
|
|
10
|
+
ZERO = X0 = 0 # constant 0
|
|
11
|
+
RA = X1 = 1 # return address
|
|
12
|
+
SP = X2 = 2 # stack pointer
|
|
13
|
+
GP = X3 = 3 # global pointer
|
|
14
|
+
TP = X4 = 4 # thread pointer
|
|
15
|
+
T0 = X5 = 5 # temporary register 0
|
|
16
|
+
T1 = X6 = 6 # temporary register 1
|
|
17
|
+
T2 = X7 = 7 # temporary register 2
|
|
18
|
+
S0 = FP = X8 = 8 # saved register / frame pointer
|
|
19
|
+
S1 = X9 = 9 # saved register
|
|
20
|
+
A0 = X10 = 10 # arg / return value
|
|
21
|
+
A1 = X11 = 11 # arg / return value
|
|
22
|
+
A2 = X12 = 12 # arg
|
|
23
|
+
A3 = X13 = 13 # arg
|
|
24
|
+
A4 = X14 = 14 # arg
|
|
25
|
+
A5 = X15 = 15 # arg
|
|
26
|
+
A6 = X16 = 16 # arg
|
|
27
|
+
A7 = X17 = 17 # arg
|
|
28
|
+
S2 = X18 = 18 # saved register
|
|
29
|
+
S3 = X19 = 19 # saved register
|
|
30
|
+
S4 = X20 = 20 # saved register
|
|
31
|
+
S5 = X21 = 21 # saved register
|
|
32
|
+
S6 = X22 = 22 # saved register
|
|
33
|
+
S7 = X23 = 23 # saved register
|
|
34
|
+
S8 = X24 = 24 # saved register
|
|
35
|
+
S9 = X25 = 25 # saved register
|
|
36
|
+
S10 = X26 = 26 # saved register
|
|
37
|
+
S11 = X27 = 27 # saved register
|
|
38
|
+
T3 = X28 = 28 # temporary register
|
|
39
|
+
T4 = X29 = 29 # temporary register
|
|
40
|
+
T5 = X30 = 30 # temporary register
|
|
41
|
+
T6 = X31 = 31 # temporary register
|
|
42
|
+
|
|
43
|
+
# @return the number associated with a named register.
|
|
44
|
+
def self.reg_number(str)
|
|
45
|
+
const_get(str.upcase)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Check if a provided number represents a valid register
|
|
49
|
+
# @return [Boolean]
|
|
50
|
+
def self._check_reg(*regs)
|
|
51
|
+
regs.each do |reg|
|
|
52
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 31 || reg < 0
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
nil
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
data/lib/rex/arch/version.rb
CHANGED
data/lib/rex/arch/zarch.rb
CHANGED
|
@@ -1,17 +1,43 @@
|
|
|
1
1
|
# -*- coding: binary -*-
|
|
2
2
|
|
|
3
3
|
module Rex
|
|
4
|
-
module Arch
|
|
4
|
+
module Arch
|
|
5
|
+
#
|
|
6
|
+
# z/Arch 64-bit
|
|
7
|
+
#
|
|
8
|
+
module ZArch
|
|
9
|
+
# Register number constants
|
|
10
|
+
R0 = 0 # general purpose, often scratch
|
|
11
|
+
R1 = 1 # general purpose, sometimes function arg
|
|
12
|
+
R2 = 2 # function argument / return value
|
|
13
|
+
R3 = 3 # function argument
|
|
14
|
+
R4 = 4 # function argument
|
|
15
|
+
R5 = 5 # function argument
|
|
16
|
+
R6 = 6 # function argument
|
|
17
|
+
R7 = 7 # function argument
|
|
18
|
+
R8 = 8 # callee-saved / local variable
|
|
19
|
+
R9 = 9 # callee-saved / local variable
|
|
20
|
+
R10 = 10 # callee-saved / local variable
|
|
21
|
+
R11 = 11 # callee-saved / local variable
|
|
22
|
+
R12 = 12 # callee-saved / local variable
|
|
23
|
+
R13 = 13 # callee-saved / local variable
|
|
24
|
+
R14 = LR = 14 # link register (return address)
|
|
25
|
+
R15 = SP = 15 # stack pointer / base register
|
|
5
26
|
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
module ZARCH
|
|
27
|
+
# @return the number associated with a named register
|
|
28
|
+
def self.reg_number(str)
|
|
29
|
+
const_get(str.upcase)
|
|
30
|
+
end
|
|
12
31
|
|
|
32
|
+
# Check if a provided number represents a valid register
|
|
33
|
+
# @return [Boolean]
|
|
34
|
+
def self._check_reg(*regs)
|
|
35
|
+
regs.each do |reg|
|
|
36
|
+
raise ArgumentError, "Invalid register #{reg}", caller if reg > 15 || reg < 0
|
|
37
|
+
end
|
|
13
38
|
|
|
39
|
+
nil
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
14
43
|
end
|
|
15
|
-
|
|
16
|
-
end end
|
|
17
|
-
|
data/lib/rex/arch.rb
CHANGED
|
@@ -16,10 +16,21 @@ module Arch
|
|
|
16
16
|
#
|
|
17
17
|
# Architecture classes
|
|
18
18
|
#
|
|
19
|
-
require 'rex/arch/
|
|
19
|
+
require 'rex/arch/aarch64'
|
|
20
|
+
require 'rex/arch/amd64'
|
|
21
|
+
require 'rex/arch/arm'
|
|
22
|
+
require 'rex/arch/loongarch64'
|
|
23
|
+
require 'rex/arch/mips32'
|
|
24
|
+
require 'rex/arch/mips64'
|
|
25
|
+
require 'rex/arch/ppc32'
|
|
26
|
+
require 'rex/arch/ppc64'
|
|
27
|
+
require 'rex/arch/riscv32'
|
|
28
|
+
require 'rex/arch/riscv64'
|
|
20
29
|
require 'rex/arch/sparc'
|
|
30
|
+
require 'rex/arch/x86'
|
|
21
31
|
require 'rex/arch/zarch'
|
|
22
32
|
|
|
33
|
+
|
|
23
34
|
#
|
|
24
35
|
# Architecture constants
|
|
25
36
|
#
|
metadata
CHANGED
|
@@ -1,40 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rex-arch
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.19
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Metasploit Hackers
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
|
-
cert_chain:
|
|
11
|
-
-
|
|
12
|
-
-----BEGIN CERTIFICATE-----
|
|
13
|
-
MIIERDCCAqygAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDDBttc2Zk
|
|
14
|
-
ZXYvREM9bWV0YXNwbG9pdC9EQz1jb20wHhcNMjMxMDMwMTYwNDI1WhcNMjUxMDI5
|
|
15
|
-
MTYwNDI1WjAmMSQwIgYDVQQDDBttc2ZkZXYvREM9bWV0YXNwbG9pdC9EQz1jb20w
|
|
16
|
-
ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDZN/EKv+yVjwiKWvjAVhjF
|
|
17
|
-
aWNYI0E9bJ5d1qKd29omRYX9a+OOKBCu5+394fyF5RjwU4mYGr2iopX9ixRJrWXH
|
|
18
|
-
ojs70tEvV1CmvP9rhz7JKzQQoJOkinrz4d+StIylxVxVdgm7DeiB3ruTwvl7qKUv
|
|
19
|
-
piWzhrBFiVU6XIEAwq6wNEmnv2D+Omyf4h0Tf99hc6G0QmBnU3XydqvnZ+AzUbBV
|
|
20
|
-
24RH3+NQoigLbvK4M5aOeYhk19di58hznebOw6twHzNczshrBeMFQp985ScNgsvF
|
|
21
|
-
rL+7HNNwpcpngERwZfzDNn7iYN5X3cyvTcykShtsuPMa5zXsYo42LZrsTF87DW38
|
|
22
|
-
D8sxL6Dgdqu25Mltdw9m+iD4rHSfb1KJYEoNO+WwBJLO2Y4d6G1CR66tVeWsZspb
|
|
23
|
-
zneOVC+sDuil7hOm+6a7Y2yrrRyT6IfL/07DywjPAIRUp5+Jn8ZrkWRNo2AOwWBG
|
|
24
|
-
k5gz7SfJPHuyVnPlxoMA0MTFCUnnnbyHu882TGoJGgMCAwEAAaN9MHswCQYDVR0T
|
|
25
|
-
BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFIQfNa4E889ZE334cwU7eNu2hScH
|
|
26
|
-
MCAGA1UdEQQZMBeBFW1zZmRldkBtZXRhc3Bsb2l0LmNvbTAgBgNVHRIEGTAXgRVt
|
|
27
|
-
c2ZkZXZAbWV0YXNwbG9pdC5jb20wDQYJKoZIhvcNAQELBQADggGBAMfzvKcV27p7
|
|
28
|
-
pctmpW2JmIXLMrjNLyGJAxELH/t9pJueXdga7uj2fJkYQDbwGw5x4MGyFqhqJLH4
|
|
29
|
-
l/qsUF3PyAXDTSWLVaqXQVWO+IIHxecG0XjPXTNudzMU0hzqbqiBKvsW7/a3V5BP
|
|
30
|
-
SWlFzrFkoXWlPouFpoakyYMJjpW4SGdPzRv7pM4OhXtkXpHiRvx5985FrHgHlI89
|
|
31
|
-
NSIuIUbp8zqk4hP1i9MV0Lc/vTf2gOmo+RHnjqG1NiYfMCYyY/Mcd4W36kGOl468
|
|
32
|
-
I8VDTwgCufkAzFu7BJ5yCOueqtDcuq+d3YhAyU7NI4+Ja8EwazOnB+07sWhKpg7z
|
|
33
|
-
yuQ1mWYPmZfVQpoSVv1CvXsoqJYXVPBBLOacKKSj8ArVG6pPn9Bej7IOQdblaFjl
|
|
34
|
-
DgscAao7wB3xW2BWEp1KnaDWkf1x9ttgoBEYyuYwU7uatB67kBQG1PKvLt79wHvz
|
|
35
|
-
Dxs+KOjGbBRfMnPgVGYkORKVrZIwlaboHbDKxcVW5xv+oZc7KYXWGg==
|
|
36
|
-
-----END CERTIFICATE-----
|
|
37
|
-
date: 2025-02-13 00:00:00.000000000 Z
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-01-15 00:00:00.000000000 Z
|
|
38
12
|
dependencies:
|
|
39
13
|
- !ruby/object:Gem::Dependency
|
|
40
14
|
name: rake
|
|
@@ -96,6 +70,16 @@ files:
|
|
|
96
70
|
- Rakefile
|
|
97
71
|
- cortex.yaml
|
|
98
72
|
- lib/rex/arch.rb
|
|
73
|
+
- lib/rex/arch/aarch64.rb
|
|
74
|
+
- lib/rex/arch/amd64.rb
|
|
75
|
+
- lib/rex/arch/arm.rb
|
|
76
|
+
- lib/rex/arch/loongarch64.rb
|
|
77
|
+
- lib/rex/arch/mips32.rb
|
|
78
|
+
- lib/rex/arch/mips64.rb
|
|
79
|
+
- lib/rex/arch/ppc32.rb
|
|
80
|
+
- lib/rex/arch/ppc64.rb
|
|
81
|
+
- lib/rex/arch/riscv32.rb
|
|
82
|
+
- lib/rex/arch/riscv64.rb
|
|
99
83
|
- lib/rex/arch/sparc.rb
|
|
100
84
|
- lib/rex/arch/version.rb
|
|
101
85
|
- lib/rex/arch/x86.rb
|
|
@@ -105,7 +89,7 @@ homepage: https://github.com/rapid7/rex-arch
|
|
|
105
89
|
licenses:
|
|
106
90
|
- BSD-3-Clause
|
|
107
91
|
metadata: {}
|
|
108
|
-
post_install_message:
|
|
92
|
+
post_install_message:
|
|
109
93
|
rdoc_options: []
|
|
110
94
|
require_paths:
|
|
111
95
|
- lib
|
|
@@ -120,8 +104,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
120
104
|
- !ruby/object:Gem::Version
|
|
121
105
|
version: '0'
|
|
122
106
|
requirements: []
|
|
123
|
-
rubygems_version: 3.
|
|
124
|
-
signing_key:
|
|
107
|
+
rubygems_version: 3.4.19
|
|
108
|
+
signing_key:
|
|
125
109
|
specification_version: 4
|
|
126
110
|
summary: Ruby Exploitation Library - rex-arch
|
|
127
111
|
test_files: []
|
checksums.yaml.gz.sig
DELETED
|
Binary file
|
data.tar.gz.sig
DELETED
|
Binary file
|
metadata.gz.sig
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
}!n�oA����܉״C��zf ��Ev��w-'�r��%�$~�`o�ՠX��K��7Eڭ��y)��<��k��gG.JB�?e�{G8���K�����M�V��(��w � ��3l\F0_P��,�<҃
|
|
2
|
-
�$M������/f�;f�
|
|
3
|
-
�ޒ!�ON�9�+87�u(�2DF��0p�U1��4l����L�� [���o���?���O�k�Q������O�&�P��x��̺Zv��IyG*�0dVN���f��q����Qį�OQn~����AQ?����J}��߱6�eS��gl����#gd���ċ��U!�����Q|�T5�j��Q���J[�'��~ʓVay��0Z�����.�7�;7��
|