diff options
author | dusoleil <howcansocksbereal@gmail.com> | 2022-03-13 17:53:23 -0400 |
---|---|---|
committer | dusoleil <howcansocksbereal@gmail.com> | 2022-03-13 17:53:23 -0400 |
commit | c486409b4dcb0048be972013801d7624f8ff4dcb (patch) | |
tree | fe0efca549689b5e114383c984bf53628546777a /tools | |
parent | ff3b871f75013748a66d1c0a4ee8de7e311d3281 (diff) | |
download | lib-des-gnux-c486409b4dcb0048be972013801d7624f8ff4dcb.tar.gz lib-des-gnux-c486409b4dcb0048be972013801d7624f8ff4dcb.zip |
sploit: Add support for nested Symtbls
Signed-off-by: dusoleil <howcansocksbereal@gmail.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/sploit/sploit/mem.py | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/tools/sploit/sploit/mem.py b/tools/sploit/sploit/mem.py index 932510d..3ad0c50 100644 --- a/tools/sploit/sploit/mem.py +++ b/tools/sploit/sploit/mem.py @@ -1,7 +1,41 @@ class Symtbl: + __subs__ = {} def __init__(self, **kwargs): self.__dict__ = {**kwargs} + def subtable(self, sym, off, table): + setattr(self, sym, off) + self.__subs__[sym] = table + + class __InnerTable__: + def __init__(self,off,tbl): + self.off = off + self.tbl = tbl + def __getattribute__(self,sym): + if(sym in ['off','tbl','__class__']): + return object.__getattribute__(self,sym) + addr = getattr(self.tbl,sym) + if(type(addr)==int): + return addr + self.off + if(type(addr)==self.__class__): + addr.off += self.off + return addr + return addr + def __setattr__(self,sym,off): + if(sym in ['off','tbl']): + return object.__setattr__(self,sym,off) + return setattr(self.tbl,sym,off-self.off) + def __str__(self): + return str(self.tbl) + + def __getattribute__(self, sym): + addr = object.__getattribute__(self,sym) + if(sym == '__subs__'):return addr + if(sym == 'base'):return 0 + if(sym in self.__subs__): + return self.__InnerTable__(addr,self.__subs__[sym]) + return addr + def adjust(self, off): self.__dict__ = {k:v+off for k,v in self.__dict__.items()} @@ -19,12 +53,16 @@ class Memmap: def __getattribute__(self, sym): if(sym in ['__tbl__','base']): return object.__getattribute__(self, sym) - a = getattr(self.__tbl__, sym) - return self.base + a + addr = getattr(self.__tbl__, sym) + if(type(addr)==Symtbl.__InnerTable__): + addr.off += self.base + return addr + return self.base + addr def __setattr__(self, sym, addr): if(sym in ['__tbl__','base']): return object.__setattr__(self,sym,addr) + return setattr(self.__tbl__,sym,addr-self.base) def __str__(self): s = __str__(self,self.__tbl__.__dict__) @@ -39,5 +77,9 @@ def __str__(self,tbl): s = 'symbols: ' + str(len(tbl)) s += __tbl_format__.format('ADDRESS', 'SYMBOL') for sym,off in sorted(tbl.items(),key=lambda x:x[1]): - s += __tbl_format__.format(hex(getattr(self,sym)),sym) + addr = getattr(self,sym) + if(type(addr)==Symtbl.__InnerTable__): + s += __tbl_format__.format(hex(addr.off),f'[{sym}]') + else: + s += __tbl_format__.format(hex(addr),sym) return s |