summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sploit/payload/gadhint.py43
-rw-r--r--sploit/rev/gadget.py23
2 files changed, 22 insertions, 44 deletions
diff --git a/sploit/payload/gadhint.py b/sploit/payload/gadhint.py
index 9b077fe..1bef9f0 100644
--- a/sploit/payload/gadhint.py
+++ b/sploit/payload/gadhint.py
@@ -1,12 +1,15 @@
+import copy
from dataclasses import dataclass, field
+
from sploit.rev.gadget import Gadget
+from sploit.types.index_entry import IndexEntry
@dataclass
-class GadHint:
+class GadHint(IndexEntry):
"""
User-annotated gadget description object
- gadget (Gadget|int): The gadget being annotated. May be a Gadget object or
+ base (Gadget|int): The gadget being annotated. May be a Gadget object or
an offset as an int.
pops (list[str]): The registers popped by this gadget, in order of
@@ -20,10 +23,10 @@ class GadHint:
Keys are destination register names, values are immediate values. The order
given is insignificant.
- writes (dict{str:str}): The register-to-memory moves (stores) made by this
- gadget. Keys are destination register names (expected to hold memory
- locations), values are source register names (expected to hold direct
- values). The order given is insignificant.
+ writes (dict{str:str}): The register-to-memory stores made by this gadget.
+ Keys are the destination register names (which hold memory addresses),
+ values are source register names (which hold values to-be-stored). The
+ order given is insignificant.
requirements (dict{str:int}): The register state that is required before
this gadget should be executed. Keys are register names, values are the
@@ -43,7 +46,7 @@ class GadHint:
should not be accounted for. A value of zero is taken as "unspecified".
"""
- gadget: int = 0
+ base: int = 0
pops: list = field(default_factory=list)
movs: dict = field(default_factory=dict)
imms: dict = field(default_factory=dict)
@@ -57,21 +60,7 @@ class GadHint:
@property
def offset(self):
"""Return gadget offset as an integer."""
- return int(self.gadget)
-
- def __index__(self):
- """Convert object to integer using offset value."""
- return self.offset
-
- def __add__(self, x):
- """Return new object with adjusted offset."""
- return GadHint(self.gadget + x, self.pops, self.movs, self.imms,
- self.writes, self.requirements, self.stack, self.align,
- self.syscall, self.spm)
-
- def __sub__(self, x):
- """Return new object with adjusted offset."""
- return self + (-x)
+ return int(self.base)
def with_requirements(self, reqs):
"""Return new object with additional requirements."""
@@ -81,9 +70,9 @@ class GadHint:
f"GadHint: Conflicting gadget requirements: "
f"{self.requirements}, {reqs}")
- return GadHint(self.gadget, self.pops, self.movs, self.imms,
- self.writes, self.requirements | reqs, self.stack,
- self.align, self.syscall, self.spm)
+ new = copy.deepcopy(self)
+ new.requirements |= reqs
+ return new
def __repr__(self):
"""Return human-readable GadHint."""
@@ -92,8 +81,8 @@ class GadHint:
return f", {name}={prop}"
return ""
- s = hex(self.gadget)
- s = f"Gadget({s})" if type(self.gadget) is Gadget else s
+ s = hex(self.base)
+ s = f"Gadget({s})" if isinstance(self.base, Gadget) else s
s += fmt("pops", self.pops)
s += fmt("movs", self.movs)
s += fmt("imms", self.imms)
diff --git a/sploit/rev/gadget.py b/sploit/rev/gadget.py
index a2564c0..cc69723 100644
--- a/sploit/rev/gadget.py
+++ b/sploit/rev/gadget.py
@@ -1,35 +1,24 @@
from dataclasses import dataclass, field
+from sploit.types.index_entry import IndexEntry
@dataclass
-class Gadget:
+class Gadget(IndexEntry):
"""
Basic gadget description object
- offset (int): The location this gadget is found at. What `offset` is
- relative to depends on context.
+ base (int): The location this gadget is found at. What `base` is relative
+ to depends on context.
asm (list[re.Match]): A list of assembly instructions matched by the gadget
search query.
"""
- offset: int = 0
+ base: int = 0
asm: list = field(default_factory=list)
- def __index__(self):
- """Convert object to integer using offset value."""
- return self.offset
-
- def __add__(self, x):
- """Return new object with adjusted offset."""
- return Gadget(self.offset + x, self.asm)
-
- def __sub__(self, x):
- """Return new object with adjusted offset."""
- return self + (-x)
-
def __repr__(self):
"""Return human-readable Gadget."""
- s = hex(self.offset)
+ s = hex(self.base)
if len(self.asm) > 0:
asm = "; ".join([ m.string for m in self.asm ])
s += f", '{asm}'"