#!/usr/bin/env python3 # -*- coding: latin-1 -*- # Scanner grezzo di riferimenti in un ELF64 LE x86-64: trova chi materializza un # indirizzo (stringa/rodata/vtable) via: # - lea reg,[rip+disp32] (48/4C 8d, o 8d senza REX) # - mov reg,[rip+disp32] (48 8b / 48 8d) # - valore assoluto u64 nei dati (tabelle/vtable) # # python -I scan_refs.py [ ...] # import struct import sys def load(path): data = open(path, 'rb').read() e_phoff = struct.unpack_from('= n: break op = buf[j] if op not in (0x8d, 0x8b, 0x89): continue if j + 6 > n: continue modrm = buf[j + 1] if (modrm & 0xC7) != 0x05: # mod=00, rm=101 -> RIP+disp32 continue # con 0x41/0x44 ecc. (REX.R/X/B) e' comunque RIP-rel se mod=00 rm=101 disp = struct.unpack_from('> 3) & 7 if rex & 4: reg += 8 kind = {0x8d: 'lea', 0x8b: 'mov-r', 0x89: 'mov-w'}.get(op, hex(op)) print('CODE %s @ %x (r%d) -> %x' % (kind, base + i, reg, tgt)) hits.add(base + i) print('abs hits: %d code hits: %d' % (len(abs_hits), len(hits))) return hits if __name__ == '__main__': elf = sys.argv[1] tgts = [int(x, 16) for x in sys.argv[2:]] print('targets: %s' % [hex(t) for t in tgts]) scan(elf, tgts)