smallworld-re 1.0.0__py3-none-any.whl
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.
- smallworld/__init__.py +35 -0
- smallworld/analyses/__init__.py +14 -0
- smallworld/analyses/analysis.py +88 -0
- smallworld/analyses/code_coverage.py +31 -0
- smallworld/analyses/colorizer.py +682 -0
- smallworld/analyses/colorizer_summary.py +100 -0
- smallworld/analyses/field_detection/__init__.py +14 -0
- smallworld/analyses/field_detection/field_analysis.py +536 -0
- smallworld/analyses/field_detection/guards.py +26 -0
- smallworld/analyses/field_detection/hints.py +133 -0
- smallworld/analyses/field_detection/malloc.py +211 -0
- smallworld/analyses/forced_exec/__init__.py +3 -0
- smallworld/analyses/forced_exec/forced_exec.py +87 -0
- smallworld/analyses/underlays/__init__.py +4 -0
- smallworld/analyses/underlays/basic.py +13 -0
- smallworld/analyses/underlays/underlay.py +31 -0
- smallworld/analyses/unstable/__init__.py +4 -0
- smallworld/analyses/unstable/angr/__init__.py +0 -0
- smallworld/analyses/unstable/angr/base.py +12 -0
- smallworld/analyses/unstable/angr/divergence.py +274 -0
- smallworld/analyses/unstable/angr/model.py +383 -0
- smallworld/analyses/unstable/angr/nwbt.py +63 -0
- smallworld/analyses/unstable/angr/typedefs.py +170 -0
- smallworld/analyses/unstable/angr/utils.py +25 -0
- smallworld/analyses/unstable/angr/visitor.py +315 -0
- smallworld/analyses/unstable/angr_nwbt.py +106 -0
- smallworld/analyses/unstable/code_coverage.py +54 -0
- smallworld/analyses/unstable/code_reachable.py +44 -0
- smallworld/analyses/unstable/control_flow_tracer.py +71 -0
- smallworld/analyses/unstable/pointer_finder.py +90 -0
- smallworld/arch/__init__.py +0 -0
- smallworld/arch/aarch64_arch.py +286 -0
- smallworld/arch/amd64_arch.py +86 -0
- smallworld/arch/i386_arch.py +44 -0
- smallworld/emulators/__init__.py +14 -0
- smallworld/emulators/angr/__init__.py +7 -0
- smallworld/emulators/angr/angr.py +1652 -0
- smallworld/emulators/angr/default.py +15 -0
- smallworld/emulators/angr/exceptions.py +7 -0
- smallworld/emulators/angr/exploration/__init__.py +9 -0
- smallworld/emulators/angr/exploration/bounds.py +27 -0
- smallworld/emulators/angr/exploration/default.py +17 -0
- smallworld/emulators/angr/exploration/terminate.py +22 -0
- smallworld/emulators/angr/factory.py +55 -0
- smallworld/emulators/angr/machdefs/__init__.py +35 -0
- smallworld/emulators/angr/machdefs/aarch64.py +292 -0
- smallworld/emulators/angr/machdefs/amd64.py +192 -0
- smallworld/emulators/angr/machdefs/arm.py +387 -0
- smallworld/emulators/angr/machdefs/i386.py +221 -0
- smallworld/emulators/angr/machdefs/machdef.py +138 -0
- smallworld/emulators/angr/machdefs/mips.py +184 -0
- smallworld/emulators/angr/machdefs/mips64.py +189 -0
- smallworld/emulators/angr/machdefs/ppc.py +101 -0
- smallworld/emulators/angr/machdefs/riscv.py +261 -0
- smallworld/emulators/angr/machdefs/xtensa.py +255 -0
- smallworld/emulators/angr/memory/__init__.py +7 -0
- smallworld/emulators/angr/memory/default.py +10 -0
- smallworld/emulators/angr/memory/fixups.py +43 -0
- smallworld/emulators/angr/memory/memtrack.py +105 -0
- smallworld/emulators/angr/scratch.py +43 -0
- smallworld/emulators/angr/simos.py +53 -0
- smallworld/emulators/angr/utils.py +70 -0
- smallworld/emulators/emulator.py +1013 -0
- smallworld/emulators/hookable.py +252 -0
- smallworld/emulators/panda/__init__.py +5 -0
- smallworld/emulators/panda/machdefs/__init__.py +28 -0
- smallworld/emulators/panda/machdefs/aarch64.py +93 -0
- smallworld/emulators/panda/machdefs/amd64.py +71 -0
- smallworld/emulators/panda/machdefs/arm.py +89 -0
- smallworld/emulators/panda/machdefs/i386.py +36 -0
- smallworld/emulators/panda/machdefs/machdef.py +86 -0
- smallworld/emulators/panda/machdefs/mips.py +94 -0
- smallworld/emulators/panda/machdefs/mips64.py +91 -0
- smallworld/emulators/panda/machdefs/ppc.py +79 -0
- smallworld/emulators/panda/panda.py +575 -0
- smallworld/emulators/unicorn/__init__.py +13 -0
- smallworld/emulators/unicorn/machdefs/__init__.py +28 -0
- smallworld/emulators/unicorn/machdefs/aarch64.py +310 -0
- smallworld/emulators/unicorn/machdefs/amd64.py +326 -0
- smallworld/emulators/unicorn/machdefs/arm.py +321 -0
- smallworld/emulators/unicorn/machdefs/i386.py +137 -0
- smallworld/emulators/unicorn/machdefs/machdef.py +117 -0
- smallworld/emulators/unicorn/machdefs/mips.py +202 -0
- smallworld/emulators/unicorn/unicorn.py +684 -0
- smallworld/exceptions/__init__.py +5 -0
- smallworld/exceptions/exceptions.py +85 -0
- smallworld/exceptions/unstable/__init__.py +1 -0
- smallworld/exceptions/unstable/exceptions.py +25 -0
- smallworld/extern/__init__.py +4 -0
- smallworld/extern/ctypes.py +94 -0
- smallworld/extern/unstable/__init__.py +1 -0
- smallworld/extern/unstable/ghidra.py +129 -0
- smallworld/helpers.py +107 -0
- smallworld/hinting/__init__.py +8 -0
- smallworld/hinting/hinting.py +214 -0
- smallworld/hinting/hints.py +427 -0
- smallworld/hinting/unstable/__init__.py +2 -0
- smallworld/hinting/utils.py +19 -0
- smallworld/instructions/__init__.py +18 -0
- smallworld/instructions/aarch64.py +20 -0
- smallworld/instructions/arm.py +18 -0
- smallworld/instructions/bsid.py +67 -0
- smallworld/instructions/instructions.py +258 -0
- smallworld/instructions/mips.py +21 -0
- smallworld/instructions/x86.py +100 -0
- smallworld/logging.py +90 -0
- smallworld/platforms.py +95 -0
- smallworld/py.typed +0 -0
- smallworld/state/__init__.py +6 -0
- smallworld/state/cpus/__init__.py +32 -0
- smallworld/state/cpus/aarch64.py +563 -0
- smallworld/state/cpus/amd64.py +676 -0
- smallworld/state/cpus/arm.py +630 -0
- smallworld/state/cpus/cpu.py +71 -0
- smallworld/state/cpus/i386.py +239 -0
- smallworld/state/cpus/mips.py +374 -0
- smallworld/state/cpus/mips64.py +372 -0
- smallworld/state/cpus/powerpc.py +229 -0
- smallworld/state/cpus/riscv.py +357 -0
- smallworld/state/cpus/xtensa.py +80 -0
- smallworld/state/memory/__init__.py +7 -0
- smallworld/state/memory/code.py +70 -0
- smallworld/state/memory/elf/__init__.py +3 -0
- smallworld/state/memory/elf/elf.py +564 -0
- smallworld/state/memory/elf/rela/__init__.py +32 -0
- smallworld/state/memory/elf/rela/aarch64.py +27 -0
- smallworld/state/memory/elf/rela/amd64.py +32 -0
- smallworld/state/memory/elf/rela/arm.py +51 -0
- smallworld/state/memory/elf/rela/i386.py +32 -0
- smallworld/state/memory/elf/rela/mips.py +45 -0
- smallworld/state/memory/elf/rela/ppc.py +45 -0
- smallworld/state/memory/elf/rela/rela.py +63 -0
- smallworld/state/memory/elf/rela/riscv64.py +27 -0
- smallworld/state/memory/elf/rela/xtensa.py +15 -0
- smallworld/state/memory/elf/structs.py +55 -0
- smallworld/state/memory/heap.py +85 -0
- smallworld/state/memory/memory.py +181 -0
- smallworld/state/memory/stack/__init__.py +31 -0
- smallworld/state/memory/stack/aarch64.py +22 -0
- smallworld/state/memory/stack/amd64.py +42 -0
- smallworld/state/memory/stack/arm.py +66 -0
- smallworld/state/memory/stack/i386.py +22 -0
- smallworld/state/memory/stack/mips.py +34 -0
- smallworld/state/memory/stack/mips64.py +34 -0
- smallworld/state/memory/stack/ppc.py +34 -0
- smallworld/state/memory/stack/riscv.py +22 -0
- smallworld/state/memory/stack/stack.py +127 -0
- smallworld/state/memory/stack/xtensa.py +34 -0
- smallworld/state/models/__init__.py +6 -0
- smallworld/state/models/mmio.py +186 -0
- smallworld/state/models/model.py +163 -0
- smallworld/state/models/posix.py +455 -0
- smallworld/state/models/x86/__init__.py +2 -0
- smallworld/state/models/x86/microsoftcdecl.py +35 -0
- smallworld/state/models/x86/systemv.py +240 -0
- smallworld/state/state.py +962 -0
- smallworld/state/unstable/__init__.py +0 -0
- smallworld/state/unstable/elf.py +393 -0
- smallworld/state/x86_registers.py +30 -0
- smallworld/utils.py +935 -0
- smallworld_re-1.0.0.dist-info/LICENSE.txt +21 -0
- smallworld_re-1.0.0.dist-info/METADATA +189 -0
- smallworld_re-1.0.0.dist-info/RECORD +166 -0
- smallworld_re-1.0.0.dist-info/WHEEL +5 -0
- smallworld_re-1.0.0.dist-info/entry_points.txt +2 -0
- smallworld_re-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,357 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
from ... import platforms, state
|
4
|
+
from . import cpu
|
5
|
+
|
6
|
+
|
7
|
+
class RISCV64(cpu.CPU):
|
8
|
+
"""CPU state for riscv64"""
|
9
|
+
|
10
|
+
platform = platforms.Platform(
|
11
|
+
platforms.Architecture.RISCV64, platforms.Byteorder.LITTLE
|
12
|
+
)
|
13
|
+
|
14
|
+
def get_general_purpose_registers(self) -> typing.List[str]:
|
15
|
+
# - x0 is wired to zero
|
16
|
+
# - x1 is the link register
|
17
|
+
# - x2 is the stack pointer
|
18
|
+
# - x3 is the global pointer
|
19
|
+
# - x4 is the thread pointer
|
20
|
+
return [f"x{i}" for i in range(5, 32)]
|
21
|
+
|
22
|
+
def __init__(self):
|
23
|
+
super().__init__()
|
24
|
+
# *** General-Purpose Registers ***
|
25
|
+
# x0 is wired to 0, and aliased as "zero"
|
26
|
+
self.x0 = state.FixedRegister("x0", 8, 0)
|
27
|
+
self.add(self.x0)
|
28
|
+
self.zero = state.RegisterAlias("zero", self.x0, 8, 0)
|
29
|
+
self.add(self.zero)
|
30
|
+
# x1 acts as the link register
|
31
|
+
# NOTE: ra is the official name; lr might be an angr invention.
|
32
|
+
self.x1 = state.Register("x1", 8)
|
33
|
+
self.add(self.x1)
|
34
|
+
self.ra = state.RegisterAlias("ra", self.x1, 8, 0)
|
35
|
+
self.add(self.ra)
|
36
|
+
# x2 acts as the stack pointer
|
37
|
+
self.x2 = state.Register("x2", 8)
|
38
|
+
self.add(self.x2)
|
39
|
+
self.sp = state.RegisterAlias("sp", self.x2, 8, 0)
|
40
|
+
self.add(self.sp)
|
41
|
+
# x3 acts as the global pointer
|
42
|
+
self.x3 = state.Register("x3", 8)
|
43
|
+
self.add(self.x3)
|
44
|
+
self.gp = state.RegisterAlias("gp", self.x3, 8, 0)
|
45
|
+
self.add(self.gp)
|
46
|
+
# x4 acts as the thread pointer
|
47
|
+
self.x4 = state.Register("x4", 8)
|
48
|
+
self.add(self.x4)
|
49
|
+
self.tp = state.RegisterAlias("tp", self.x4, 8, 0)
|
50
|
+
self.add(self.tp)
|
51
|
+
# x5 is a temporary register
|
52
|
+
self.x5 = state.Register("x5", 8)
|
53
|
+
self.add(self.x5)
|
54
|
+
self.t0 = state.RegisterAlias("t0", self.x5, 8, 0)
|
55
|
+
self.add(self.t0)
|
56
|
+
# x6 is a temporary register
|
57
|
+
self.x6 = state.Register("x6", 8)
|
58
|
+
self.add(self.x6)
|
59
|
+
self.t1 = state.RegisterAlias("t1", self.x6, 8, 0)
|
60
|
+
self.add(self.t1)
|
61
|
+
# x7 is a temporary register
|
62
|
+
self.x7 = state.Register("x7", 8)
|
63
|
+
self.add(self.x7)
|
64
|
+
self.t2 = state.RegisterAlias("t2", self.x7, 8, 0)
|
65
|
+
self.add(self.t2)
|
66
|
+
# x8 is a callee-saved register
|
67
|
+
self.x8 = state.Register("x8", 8)
|
68
|
+
self.add(self.x8)
|
69
|
+
self.s0 = state.RegisterAlias("s0", self.x8, 8, 0)
|
70
|
+
self.add(self.x8)
|
71
|
+
# x9 is a callee-saved register
|
72
|
+
self.x9 = state.Register("x9", 8)
|
73
|
+
self.add(self.x9)
|
74
|
+
self.s1 = state.RegisterAlias("s1", self.x9, 8, 0)
|
75
|
+
self.add(self.s1)
|
76
|
+
# x10 is argument 0
|
77
|
+
self.x10 = state.Register("x10", 8)
|
78
|
+
self.add(self.x10)
|
79
|
+
self.a0 = state.RegisterAlias("a0", self.x10, 8, 0)
|
80
|
+
self.add(self.a0)
|
81
|
+
# x11 is argument 1
|
82
|
+
self.x11 = state.Register("x11", 8)
|
83
|
+
self.add(self.x11)
|
84
|
+
self.a1 = state.RegisterAlias("a1", self.x11, 8, 0)
|
85
|
+
self.add(self.a1)
|
86
|
+
# x12 is argument 2
|
87
|
+
self.x12 = state.Register("x12", 8)
|
88
|
+
self.add(self.x12)
|
89
|
+
self.a2 = state.RegisterAlias("a2", self.x12, 8, 0)
|
90
|
+
self.add(self.a2)
|
91
|
+
# x13 is argument 3
|
92
|
+
self.x13 = state.Register("x13", 8)
|
93
|
+
self.add(self.x13)
|
94
|
+
self.a3 = state.RegisterAlias("a3", self.x13, 8, 0)
|
95
|
+
self.add(self.a3)
|
96
|
+
# x14 is argument 4
|
97
|
+
self.x14 = state.Register("x14", 8)
|
98
|
+
self.add(self.x14)
|
99
|
+
self.a4 = state.RegisterAlias("a4", self.x14, 8, 0)
|
100
|
+
self.add(self.a4)
|
101
|
+
# x15 is argument 5
|
102
|
+
self.x15 = state.Register("x15", 8)
|
103
|
+
self.add(self.x15)
|
104
|
+
self.a5 = state.RegisterAlias("a5", self.x15, 8, 0)
|
105
|
+
self.add(self.a5)
|
106
|
+
# x16 is argument 6
|
107
|
+
self.x16 = state.Register("x16", 8)
|
108
|
+
self.add(self.x16)
|
109
|
+
self.a6 = state.RegisterAlias("a6", self.x16, 8, 0)
|
110
|
+
self.add(self.a6)
|
111
|
+
# x17 is argument 7
|
112
|
+
self.x17 = state.Register("x17", 8)
|
113
|
+
self.add(self.x17)
|
114
|
+
self.a7 = state.RegisterAlias("a7", self.x17, 8, 0)
|
115
|
+
self.add(self.a7)
|
116
|
+
# x18 is a callee-saved register
|
117
|
+
self.x18 = state.Register("x18", 8)
|
118
|
+
self.add(self.x18)
|
119
|
+
self.s2 = state.RegisterAlias("s2", self.x18, 8, 0)
|
120
|
+
self.add(self.s2)
|
121
|
+
# x19 is a callee-saved register
|
122
|
+
self.x19 = state.Register("x19", 8)
|
123
|
+
self.add(self.x19)
|
124
|
+
self.s3 = state.RegisterAlias("s3", self.x19, 8, 0)
|
125
|
+
self.add(self.s3)
|
126
|
+
# x20 is a callee-saved register
|
127
|
+
self.x20 = state.Register("x20", 8)
|
128
|
+
self.add(self.x20)
|
129
|
+
self.s4 = state.RegisterAlias("s4", self.x20, 8, 0)
|
130
|
+
self.add(self.s4)
|
131
|
+
# x21 is a callee-saved register
|
132
|
+
self.x21 = state.Register("x21", 8)
|
133
|
+
self.add(self.x21)
|
134
|
+
self.s5 = state.RegisterAlias("s5", self.x21, 8, 0)
|
135
|
+
self.add(self.s5)
|
136
|
+
# x22 is a callee-saved register
|
137
|
+
self.x22 = state.Register("x22", 8)
|
138
|
+
self.add(self.x22)
|
139
|
+
self.s6 = state.RegisterAlias("s6", self.x22, 8, 0)
|
140
|
+
self.add(self.s6)
|
141
|
+
# x23 is a callee-saved register
|
142
|
+
self.x23 = state.Register("x23", 8)
|
143
|
+
self.add(self.x23)
|
144
|
+
self.s7 = state.RegisterAlias("s7", self.x23, 8, 0)
|
145
|
+
self.add(self.s7)
|
146
|
+
# x24 is a callee-saved register
|
147
|
+
self.x24 = state.Register("x24", 8)
|
148
|
+
self.add(self.x24)
|
149
|
+
self.s8 = state.RegisterAlias("s8", self.x24, 8, 0)
|
150
|
+
self.add(self.s8)
|
151
|
+
# x25 is a callee-saved register
|
152
|
+
self.x25 = state.Register("x25", 8)
|
153
|
+
self.add(self.x25)
|
154
|
+
self.s9 = state.RegisterAlias("s9", self.x25, 8, 0)
|
155
|
+
self.add(self.s9)
|
156
|
+
# x26 is a callee-saved register
|
157
|
+
self.x26 = state.Register("x26", 8)
|
158
|
+
self.add(self.x26)
|
159
|
+
self.s10 = state.RegisterAlias("s10", self.x26, 8, 0)
|
160
|
+
self.add(self.s10)
|
161
|
+
# x27 is a callee-saved register
|
162
|
+
self.x27 = state.Register("x27", 8)
|
163
|
+
self.add(self.x27)
|
164
|
+
self.s11 = state.RegisterAlias("s11", self.x27, 8, 0)
|
165
|
+
self.add(self.s11)
|
166
|
+
# x28 is a temporary register
|
167
|
+
self.x28 = state.Register("x28", 8)
|
168
|
+
self.add(self.x28)
|
169
|
+
self.t3 = state.RegisterAlias("t3", self.x28, 8, 0)
|
170
|
+
self.add(self.t3)
|
171
|
+
# x29 is a temporary register
|
172
|
+
self.x29 = state.Register("x29", 8)
|
173
|
+
self.add(self.x29)
|
174
|
+
self.t4 = state.RegisterAlias("t4", self.x29, 8, 0)
|
175
|
+
self.add(self.t4)
|
176
|
+
# x30 is a temporary register
|
177
|
+
self.x30 = state.Register("x30", 8)
|
178
|
+
self.add(self.x30)
|
179
|
+
self.t5 = state.RegisterAlias("t5", self.x30, 8, 0)
|
180
|
+
self.add(self.t5)
|
181
|
+
# x31 is a temporary register
|
182
|
+
self.x31 = state.Register("x31", 8)
|
183
|
+
self.add(self.x31)
|
184
|
+
self.t6 = state.RegisterAlias("t6", self.x31, 8, 0)
|
185
|
+
self.add(self.t6)
|
186
|
+
|
187
|
+
# *** Program Counter ***
|
188
|
+
self.pc = state.Register("pc", 8)
|
189
|
+
self.add(self.pc)
|
190
|
+
|
191
|
+
# *** Floating-Point Registers ***
|
192
|
+
# f0 is a temporary register
|
193
|
+
self.f0 = state.Register("f0", 8)
|
194
|
+
self.add(self.f0)
|
195
|
+
self.ft0 = state.RegisterAlias("ft0", self.f0, 8, 0)
|
196
|
+
self.add(self.ft0)
|
197
|
+
# f1 is a temporary register
|
198
|
+
self.f1 = state.Register("f1", 8)
|
199
|
+
self.add(self.f1)
|
200
|
+
self.ft1 = state.RegisterAlias("ft1", self.f1, 8, 0)
|
201
|
+
self.add(self.ft1)
|
202
|
+
# f2 is a temporary register
|
203
|
+
self.f2 = state.Register("f2", 8)
|
204
|
+
self.add(self.f2)
|
205
|
+
self.ft2 = state.RegisterAlias("ft2", self.f2, 8, 0)
|
206
|
+
self.add(self.ft2)
|
207
|
+
# f3 is a temporary register
|
208
|
+
self.f3 = state.Register("f3", 8)
|
209
|
+
self.add(self.f3)
|
210
|
+
self.ft3 = state.RegisterAlias("ft3", self.f3, 8, 0)
|
211
|
+
self.add(self.ft3)
|
212
|
+
# f4 is a temporary register
|
213
|
+
self.f4 = state.Register("f4", 8)
|
214
|
+
self.add(self.f4)
|
215
|
+
self.ft4 = state.RegisterAlias("ft4", self.f4, 8, 0)
|
216
|
+
self.add(self.ft4)
|
217
|
+
# f5 is a temporary register
|
218
|
+
self.f5 = state.Register("f5", 8)
|
219
|
+
self.add(self.f5)
|
220
|
+
self.ft5 = state.RegisterAlias("ft5", self.f5, 8, 0)
|
221
|
+
self.add(self.ft5)
|
222
|
+
# f6 is a temporary register
|
223
|
+
self.f6 = state.Register("f6", 8)
|
224
|
+
self.add(self.f6)
|
225
|
+
self.ft6 = state.RegisterAlias("ft6", self.f6, 8, 0)
|
226
|
+
self.add(self.ft6)
|
227
|
+
# f7 is a temporary register
|
228
|
+
self.f7 = state.Register("f7", 8)
|
229
|
+
self.add(self.f7)
|
230
|
+
self.ft7 = state.RegisterAlias("ft7", self.f7, 8, 0)
|
231
|
+
self.add(self.ft7)
|
232
|
+
# f8 is a callee saved register
|
233
|
+
self.f8 = state.Register("f8", 8)
|
234
|
+
self.add(self.f8)
|
235
|
+
self.fs0 = state.RegisterAlias("fs0", self.f8, 8, 0)
|
236
|
+
self.add(self.fs0)
|
237
|
+
# f9 is a callee saved register
|
238
|
+
self.f9 = state.Register("f9", 8)
|
239
|
+
self.add(self.f9)
|
240
|
+
self.fs1 = state.RegisterAlias("fs1", self.f9, 8, 0)
|
241
|
+
self.add(self.fs1)
|
242
|
+
# f10 is argument 0
|
243
|
+
self.f10 = state.Register("f10", 8)
|
244
|
+
self.add(self.f10)
|
245
|
+
self.fa0 = state.RegisterAlias("fa0", self.f10, 8, 0)
|
246
|
+
self.add(self.fa0)
|
247
|
+
# f11 is argument 1
|
248
|
+
self.f11 = state.Register("f11", 8)
|
249
|
+
self.add(self.f11)
|
250
|
+
self.fa1 = state.RegisterAlias("fa1", self.f11, 8, 0)
|
251
|
+
self.add(self.fa1)
|
252
|
+
# f12 is argument 2
|
253
|
+
self.f12 = state.Register("f12", 8)
|
254
|
+
self.add(self.f12)
|
255
|
+
self.fa2 = state.RegisterAlias("fa2", self.f12, 8, 0)
|
256
|
+
self.add(self.fa2)
|
257
|
+
# f13 is argument 3
|
258
|
+
self.f13 = state.Register("f13", 8)
|
259
|
+
self.add(self.f13)
|
260
|
+
self.fa3 = state.RegisterAlias("fa3", self.f13, 8, 0)
|
261
|
+
self.add(self.fa3)
|
262
|
+
# f14 is argument 4
|
263
|
+
self.f14 = state.Register("f14", 8)
|
264
|
+
self.add(self.f14)
|
265
|
+
self.fa4 = state.RegisterAlias("fa4", self.f14, 8, 0)
|
266
|
+
self.add(self.fa4)
|
267
|
+
# f15 is argument 5
|
268
|
+
self.f15 = state.Register("f15", 8)
|
269
|
+
self.add(self.f15)
|
270
|
+
self.fa5 = state.RegisterAlias("fa5", self.f15, 8, 0)
|
271
|
+
self.add(self.fa5)
|
272
|
+
# f16 is argument 6
|
273
|
+
self.f16 = state.Register("f16", 8)
|
274
|
+
self.add(self.f16)
|
275
|
+
self.fa6 = state.RegisterAlias("fa6", self.f16, 8, 0)
|
276
|
+
self.add(self.fa6)
|
277
|
+
# f7 is argument 7
|
278
|
+
self.f17 = state.Register("f17", 8)
|
279
|
+
self.add(self.f17)
|
280
|
+
self.fa7 = state.RegisterAlias("fa7", self.f17, 8, 0)
|
281
|
+
self.add(self.fa7)
|
282
|
+
# f18 is a callee-saved register
|
283
|
+
self.f18 = state.Register("f18", 8)
|
284
|
+
self.add(self.f18)
|
285
|
+
self.fs2 = state.RegisterAlias("fs2", self.f18, 8, 0)
|
286
|
+
self.add(self.fs2)
|
287
|
+
# f19 is a callee-saved register
|
288
|
+
self.f19 = state.Register("f19", 8)
|
289
|
+
self.add(self.f19)
|
290
|
+
self.fs3 = state.RegisterAlias("fs3", self.f19, 8, 0)
|
291
|
+
self.add(self.fs3)
|
292
|
+
# f20 is a callee-saved register
|
293
|
+
self.f20 = state.Register("f20", 8)
|
294
|
+
self.add(self.f20)
|
295
|
+
self.fs4 = state.RegisterAlias("fs4", self.f20, 8, 0)
|
296
|
+
self.add(self.fs4)
|
297
|
+
# f21 is a callee-saved register
|
298
|
+
self.f21 = state.Register("f21", 8)
|
299
|
+
self.add(self.f21)
|
300
|
+
self.fs5 = state.RegisterAlias("fs5", self.f21, 8, 0)
|
301
|
+
self.add(self.fs5)
|
302
|
+
# f22 is a callee-saved register
|
303
|
+
self.f22 = state.Register("f22", 8)
|
304
|
+
self.add(self.f22)
|
305
|
+
self.fs6 = state.RegisterAlias("fs6", self.f22, 8, 0)
|
306
|
+
self.add(self.fs6)
|
307
|
+
# f23 is a callee-saved register
|
308
|
+
self.f23 = state.Register("f23", 8)
|
309
|
+
self.add(self.f23)
|
310
|
+
self.fs7 = state.RegisterAlias("fs7", self.f23, 8, 0)
|
311
|
+
self.add(self.fs7)
|
312
|
+
# f24 is a callee-saved register
|
313
|
+
self.f24 = state.Register("f24", 8)
|
314
|
+
self.add(self.f24)
|
315
|
+
self.fs8 = state.RegisterAlias("fs8", self.f24, 8, 0)
|
316
|
+
self.add(self.fs8)
|
317
|
+
# f25 is a callee-saved register
|
318
|
+
self.f25 = state.Register("f25", 8)
|
319
|
+
self.add(self.f25)
|
320
|
+
self.fs9 = state.RegisterAlias("fs9", self.f25, 8, 0)
|
321
|
+
self.add(self.fs9)
|
322
|
+
# f26 is a callee-saved register
|
323
|
+
self.f26 = state.Register("f26", 8)
|
324
|
+
self.add(self.f26)
|
325
|
+
self.fs10 = state.RegisterAlias("fs10", self.f26, 8, 0)
|
326
|
+
self.add(self.fs10)
|
327
|
+
# f27 is a callee-saved register
|
328
|
+
self.f27 = state.Register("f27", 8)
|
329
|
+
self.add(self.f27)
|
330
|
+
self.fs11 = state.RegisterAlias("fs11", self.f27, 8, 0)
|
331
|
+
self.add(self.fs11)
|
332
|
+
# f28 is a temporary register
|
333
|
+
self.f28 = state.Register("f28", 8)
|
334
|
+
self.add(self.f28)
|
335
|
+
self.ft8 = state.RegisterAlias("ft8", self.f28, 8, 0)
|
336
|
+
self.add(self.ft8)
|
337
|
+
# f29 is a temporary register
|
338
|
+
self.f29 = state.Register("f29", 8)
|
339
|
+
self.add(self.f29)
|
340
|
+
self.ft9 = state.RegisterAlias("ft9", self.f29, 8, 0)
|
341
|
+
self.add(self.ft9)
|
342
|
+
# f30 is a temporary register
|
343
|
+
self.f30 = state.Register("f30", 8)
|
344
|
+
self.add(self.f30)
|
345
|
+
self.ft10 = state.RegisterAlias("ft10", self.f30, 8, 0)
|
346
|
+
self.add(self.ft10)
|
347
|
+
# f31 is a temporary register
|
348
|
+
self.f31 = state.Register("f31", 8)
|
349
|
+
self.add(self.f31)
|
350
|
+
self.ft11 = state.RegisterAlias("ft11", self.f31, 8, 0)
|
351
|
+
self.add(self.ft11)
|
352
|
+
|
353
|
+
# *** Vector Registers ***
|
354
|
+
# NOTE: These exist, but are not supported
|
355
|
+
|
356
|
+
# *** Control and Status Registers ***
|
357
|
+
# NOTE: These exist, but aren't supported.
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
from ... import platforms, state
|
4
|
+
from . import cpu
|
5
|
+
|
6
|
+
|
7
|
+
class XTensa(cpu.CPU):
|
8
|
+
"""CPU for XTensa, little-endian
|
9
|
+
|
10
|
+
Like RISC-V, which shares its lineage,
|
11
|
+
xtensa has a very small core architecture
|
12
|
+
with a metric boatload of optional extensions.
|
13
|
+
|
14
|
+
One noteable option is that xtensa uses register windows.
|
15
|
+
I'm not putting up with that shit for now.
|
16
|
+
"""
|
17
|
+
|
18
|
+
def get_general_purpose_registers(self) -> typing.List[str]:
|
19
|
+
return [f"a{i}" for i in range(0, 16)]
|
20
|
+
|
21
|
+
def __init__(self):
|
22
|
+
super().__init__()
|
23
|
+
# *** General Purpose Registers ***
|
24
|
+
# a0 is also the default link register, but it doesn't get an alias
|
25
|
+
self.a0 = state.Register("a0", 4)
|
26
|
+
self.add(self.a0)
|
27
|
+
# a1 is also the stack pointer
|
28
|
+
self.a1 = state.Register("a1", 4)
|
29
|
+
self.add(self.a1)
|
30
|
+
self.sp = state.RegisterAlias("sp", self.a1, 4, 0)
|
31
|
+
self.add(self.sp)
|
32
|
+
self.a2 = state.Register("a2", 4)
|
33
|
+
self.add(self.a2)
|
34
|
+
self.a3 = state.Register("a3", 4)
|
35
|
+
self.add(self.a3)
|
36
|
+
self.a4 = state.Register("a4", 4)
|
37
|
+
self.add(self.a4)
|
38
|
+
self.a5 = state.Register("a5", 4)
|
39
|
+
self.add(self.a5)
|
40
|
+
self.a6 = state.Register("a6", 4)
|
41
|
+
self.add(self.a6)
|
42
|
+
self.a7 = state.Register("a7", 4)
|
43
|
+
self.add(self.a7)
|
44
|
+
self.a8 = state.Register("a8", 4)
|
45
|
+
self.add(self.a8)
|
46
|
+
self.a9 = state.Register("a9", 4)
|
47
|
+
self.add(self.a9)
|
48
|
+
self.a10 = state.Register("a10", 4)
|
49
|
+
self.add(self.a10)
|
50
|
+
self.a11 = state.Register("a11", 4)
|
51
|
+
self.add(self.a11)
|
52
|
+
self.a12 = state.Register("a12", 4)
|
53
|
+
self.add(self.a12)
|
54
|
+
self.a13 = state.Register("a13", 4)
|
55
|
+
self.add(self.a13)
|
56
|
+
self.a14 = state.Register("a14", 4)
|
57
|
+
self.add(self.a14)
|
58
|
+
self.a15 = state.Register("a15", 4)
|
59
|
+
self.add(self.a15)
|
60
|
+
|
61
|
+
# *** Program Counter ***
|
62
|
+
self.pc = state.Register("pc", 4)
|
63
|
+
self.add(self.pc)
|
64
|
+
|
65
|
+
# *** Shift Amount Register ***
|
66
|
+
# This thing is actually 6 bits.
|
67
|
+
self.sar = state.Register("sar", 4)
|
68
|
+
self.add(self.sar)
|
69
|
+
|
70
|
+
|
71
|
+
class XTensaEL(XTensa):
|
72
|
+
platform = platforms.Platform(
|
73
|
+
platforms.Architecture.XTENSA, platforms.Byteorder.LITTLE
|
74
|
+
)
|
75
|
+
|
76
|
+
|
77
|
+
class XTensaBE(XTensa):
|
78
|
+
platform = platforms.Platform(
|
79
|
+
platforms.Architecture.XTENSA, platforms.Byteorder.BIG
|
80
|
+
)
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
import claripy
|
4
|
+
|
5
|
+
from ... import emulators
|
6
|
+
from ...platforms import Platform
|
7
|
+
from ..state import Value
|
8
|
+
from . import memory
|
9
|
+
|
10
|
+
|
11
|
+
class Executable(memory.RawMemory):
|
12
|
+
"""An execuable piece of code."""
|
13
|
+
|
14
|
+
entrypoint: typing.Optional[int] = None
|
15
|
+
"""Entry point address.
|
16
|
+
|
17
|
+
Note:
|
18
|
+
This is not used by Emulators - but is available for reference from
|
19
|
+
file parsing, if supported.
|
20
|
+
"""
|
21
|
+
|
22
|
+
def _write_content(self, emulator: emulators.Emulator, address: int, value: Value):
|
23
|
+
if isinstance(value.get_content(), claripy.ast.bv.BV):
|
24
|
+
raise NotImplementedError(
|
25
|
+
"Absolutely not. Get your symbolic code out of here."
|
26
|
+
)
|
27
|
+
emulator.write_code(address, value.to_bytes(emulator.platform.byteorder))
|
28
|
+
|
29
|
+
@classmethod
|
30
|
+
def from_elf(
|
31
|
+
cls,
|
32
|
+
file: typing.BinaryIO,
|
33
|
+
address: typing.Optional[int] = None,
|
34
|
+
platform: typing.Optional[Platform] = None,
|
35
|
+
ignore_platform: bool = False,
|
36
|
+
):
|
37
|
+
"""Load an ELF executable from an open file-like object.
|
38
|
+
|
39
|
+
Arguments:
|
40
|
+
file: The open file-like object from which to read.
|
41
|
+
address: The address where this executable should be loaded.
|
42
|
+
platform: Optional platform for header verification
|
43
|
+
ignore_platform: Skip platform ID and verification
|
44
|
+
|
45
|
+
Returns:
|
46
|
+
An Executable parsed from the given ELF file-like object.
|
47
|
+
"""
|
48
|
+
# NOTE: there's a circular dependency between elf.py and code.py
|
49
|
+
# This is the accepted fix.
|
50
|
+
from .elf import ElfExecutable
|
51
|
+
|
52
|
+
return ElfExecutable(
|
53
|
+
file, user_base=address, platform=platform, ignore_platform=ignore_platform
|
54
|
+
)
|
55
|
+
|
56
|
+
@classmethod
|
57
|
+
def from_pe(cls, file: typing.BinaryIO):
|
58
|
+
"""Load an PE executable from an open file-like object.
|
59
|
+
|
60
|
+
Arguments:
|
61
|
+
file: The open file-like object from which to read.
|
62
|
+
address: The address where this executable should be loaded.
|
63
|
+
|
64
|
+
Returns:
|
65
|
+
An Executable parsed from the given PE file-like object.
|
66
|
+
"""
|
67
|
+
raise NotImplementedError("PE parsing not yet implemented")
|
68
|
+
|
69
|
+
|
70
|
+
__all__ = ["Executable"]
|