def load_image_fobj(self, fobj): """load a BinImage from an ELF file given via file object""" # read elf file reader = ELFReader() elf = reader.load(fobj) # create bin image and assign elf file bi = BinImage(BIN_IMAGE_TYPE_ELF) bi.set_file_data(elf) # walk through elf sections sect_to_seg = {} for sect in elf.sections: # determine segment type seg_type = None name = sect.name_str flags = 0 if name == '.text': seg_type = SEGMENT_TYPE_CODE elif name == '.data': seg_type = SEGMENT_TYPE_DATA elif name == '.rodata': seg_type = SEGMENT_TYPE_DATA flags = SEGMENT_FLAG_READ_ONLY elif name == '.bss': seg_type = SEGMENT_TYPE_BSS # we got a segment if seg_type is not None: size = sect.header.size data = sect.data seg = Segment(seg_type, size, data, flags) bi.add_segment(seg) # assign section to segment seg.set_file_data(sect) sect_to_seg[sect] = seg # now run through segments to add relocations bi_segs = bi.get_segments() for seg in bi_segs: # retrieve associated ELF section sect = seg.get_file_data() # any relocations? rela = sect.get_rela() num_rela = len(rela) if num_rela > 0: self.add_elf_rela(sect, seg, sect_to_seg) # any symbols? symbols = sect.get_symbols() num_syms = len(symbols) if num_syms > 0: self.add_elf_symbols(symbols, seg) # try to add debug info ddl = DwarfDebugLine() got = ddl.decode(elf) if got: self.add_debug_line(ddl, bi, sect_to_seg) return bi
for rela in rela_sect.get_relocations(): self._dump_rela_entry(rela, prefix="%4d " % num) num += 1 def dump_relas_by_sect(self): print "ELF Relocations (by sections)" for sect in self.elf.sections: to_sects = sect.get_rela_sections() if len(to_sects) > 0: print " section", sect.idx for to_sect in to_sects: print " -> section", to_sect.idx num = 0 for rela in sect.get_rela_by_section(to_sect): self._dump_rela_entry(rela, prefix=" %4d " % num) num += 1 if __name__ == '__main__': from ELFReader import ELFReader import sys reader = ELFReader() for a in sys.argv[1:]: f = open(a, "rb") ef = reader.load(f) dumper = ELFDumper(ef) dumper.dump_sections(True, True) dumper.dump_symbols() dumper.dump_relas() dumper.dump_relas_by_sect()
txt, sym.name_str) def dump_relas(self): print "ELF Relocations" rela_sects = self.elf.relas if len(rela_sects) == 0: print "no relocations" return for rela_sect in rela_sects: print rela_sect.name_str, "linked to", rela_sect.reloc_section.name_str print " offset type segment + addend symbol + addend" num = 0 for rela in rela_sect.get_relocations(): self._dump_rela_entry(rela, prefix="%4d " % num) num += 1 if __name__ == '__main__': from ELFReader import ELFReader import sys reader = ELFReader() for a in sys.argv[1:]: f = open(a, "rb") ef = reader.load(f) dumper = ELFDumper(ef) dumper.dump_sections(True, True) dumper.dump_symbols() dumper.dump_relas()