Ejemplo n.º 1
0
  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
Ejemplo n.º 2
0
            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()
Ejemplo n.º 3
0
             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()