#!/usr/bin/env python3 import sys import hashlib import re def cleanup_line(l): l = l.strip() if "(/lib/x86_64-linux-gnu/libc-2.23.so)" in l: return "" if "(/lib/x86_64-linux-gnu/ld-2.23.so)" in l: return "" if "(/usr/lib/x86_64-linux-gnu/libgomp.so" in l: return "" try: l = l[l.index("branches:"):] except Exception: print(repr(l), file=sys.stderr) return "" m1 = re.search("branches: ([0-9a-f]{12}) ([^ ]+)", l) m2 = re.search("=> ([0-9a-f]{10})([0-9a-f]{2})( [^ ]+)", l) try: return m1.group(2) + " => " + m2.group(2) + m2.group(3) except AttributeError: print(m1, m2, repr(l), file=sys.stderr) def main(): libmagickcore_base = -1 libfreetype6_base = -1 for l in sys.stdin: if "MagickCoreGenesis+0x0 (/usr/lib/x86_64-linux-gnu/libMagickCore-6.Q16.so.2.0.0" in l: l = l[l.index("branches:")+len("branches:"):l.index("MagickCoreGenesis+0x0")] libmagickcore_base = int(l, 16) - 0x127190 print("libMagickCore base: 0x%016x" % libmagickcore_base) # 7fd5dd38130e FT_New_Memory (/usr/lib/x86_64-linux-gnu/libfreetype.so.6.12.1) if "FT_New_Memory+0x3f " in l: l = l[l.index("branches:")+len("branches:"):l.index("FT_New_Memory")] libfreetype6_base = int(l, 16) - 0x1133f print("libfreetype6_base base: 0x%016x" % libfreetype6_base) if libmagickcore_base >= 0 and libfreetype6_base >= 0: break from_ = lambda x: "%x" % x to_ = lambda x: "=> %x" % x # AcquireAuthenticCacheView --- DestroyCacheView #addr_entry = from_(libmagickcore_base + 0x000430e5) #addr_return = to_ (libmagickcore_base + 0x000435d6) # 0x00042a68 e8b349ffff call sym.imp.FT_Get_Char_Index addr_entry = from_(libmagickcore_base + 0x00042a68) addr_return = to_ (libmagickcore_base + 0x00042a6d) # #addr_entry = from_(libmagickcore_base + 0x00042adb) #addr_return = to_ (libmagickcore_base + 0x00042ae0) #addr_entry = "ft_smooth_render_generic+0x28e" #addr_return = "53 ft_smooth_render_generic" print(addr_entry) print(addr_return) while True: trace = [] for line in sys.stdin: if addr_entry in line: trace.append(cleanup_line(line)) break else: break for line in sys.stdin: trace.append(cleanup_line(line)) if addr_return in line: break else: break trace = [t for t in trace if t] trace = [t for t in trace if "ps_unicodes_char_index" in t] print(len(trace), hashlib.sha256(str(trace).encode()).hexdigest()) #continue print("\n".join(trace)) print('='*80) print('='*80) if __name__ == "__main__": main()