Ejemplo n.º 1
0
 def test_set_name_offset(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "name_offset"), False)
     sect = sect.prepare(0, 0, 5, 32, "<")
     self.assertEqual(sect.name_offset, 5)
     sect.name_offset = 25
     self.assertEqual(sect.name_offset, 25)
Ejemplo n.º 2
0
 def test_set_name_offset(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "name_offset"), False)
     sect = sect.prepare(0, 0, 5, 32, '<')
     self.assertEqual(sect.name_offset, 5)
     sect.name_offset = 25
     self.assertEqual(sect.name_offset, 25)
Ejemplo n.º 3
0
    def test_remove_nobits(self):
        for file_name in ["data/null_elf",
                          "data/arm_exec",
                          "data/arm_stripped_exec",
                          "data/arm_exec_nosect",
                          "data/arm_object",
                          "data/mips64_exec",
                          "data/mips32_exec",
                          "data/ia32_exec",
                          "data/amd64_exec",
                          "data/ia64_exec",
                          ]:
            ef = PreparedElfFile(filename=file_name)
            if ef.segments:
                seg_sizes = []
                for segment in ef.segments:
                    seg_sizes.append((segment.get_memsz(), segment.get_filesz()))
                ef.remove_nobits()
                for segment, seg_size in zip(ef.segments, seg_sizes):
                    self.assertEqual(segment.get_memsz(), segment.get_filesz())
                    self.assertEqual(segment.get_memsz(), seg_size[0])

        ef = UnpreparedElfFile()
        sec = UnpreparedElfSection(None, section_type=SHT_NOBITS, data=10)
        self.assertEqual(sec.get_size(), 10)
        ef.add_section(sec)
        ef.remove_nobits()
        sec = ef.sections[1]
        self.assertEqual(sec.type, SHT_PROGBITS)
        self.assertEqual(sec.get_size(), 10)
        self.assertEqual(sec.get_file_data(), ByteArray('\0' * 10))
Ejemplo n.º 4
0
    def test_copy(self):
        sect = BaseElfSection("test")
        self.assertRaises(NotImplementedError, sect.copy)

        sect = UnpreparedElfSection("test")
        new_sect = sect.copy()
        self.assertEquals(sect.name, new_sect.name)

        prep_sect = sect.prepare(0, 0, 0, 32, '<')
        new_sect = prep_sect.copy()
        self.assertEquals(prep_sect.name, new_sect.name)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        new_sect = sect.copy()
        self.assertEquals(sect.name, new_sect.name)

        prep_sect = sect.prepare(0, 0, 0, 32, '<')
        new_sect = prep_sect.copy()
        self.assertEquals(prep_sect.name, new_sect.name)

        sect = UnpreparedElfStringTable("string")
        strings = ["foo", "bar", "baz"]
        for string in strings:
            sect.add_string(string)
        new_sect = sect.copy()
        for i in range(len(strings)):
            self.assertEquals(sect.get_string_idx(i),
                              new_sect.get_string_idx(i))
Ejemplo n.º 5
0
    def test_remove_nobits(self):
        for file_name in [
            "data/null_elf",
            "data/arm_exec",
            "data/arm_exec_nosect",
            "data/arm_object",
            "data/mips64_exec",
            "data/mips32_exec",
            "data/ia32_exec",
            "data/amd64_exec",
            "data/ia64_exec",
        ]:
            ef = PreparedElfFile(filename=file_name)
            if ef.segments:
                seg_sizes = []
                for segment in ef.segments:
                    seg_sizes.append((segment.get_memsz(), segment.get_filesz()))
                ef.remove_nobits()
                count = 0
                for segment in ef.segments:
                    self.assertEqual(segment.get_memsz(), segment.get_filesz())
                    self.assertEqual(segment.get_memsz(), seg_sizes[count][0])
                    count += 1

        ef = UnpreparedElfFile()
        sec = UnpreparedElfSection(section_type=SHT_NOBITS, data=10)
        self.assertEqual(sec.get_size(), 10)
        ef.add_section(sec)
        ef.remove_nobits()
        sec = ef.sections[1]
        self.assertEqual(sec.type, SHT_PROGBITS)
        self.assertEqual(sec.get_size(), 10)
        self.assertEqual(sec.get_file_data(), ByteArray("\0" * 10))
Ejemplo n.º 6
0
    def test_replace_section(self):
        seg = SectionedElfSegment(sections=[UnpreparedElfSection("test")])
        old_section = seg.get_sections()[0]
        new_section = UnpreparedElfSection("new")
        seg.replace_section(old_section, new_section)
        self.assertEqual(seg.get_sections(), [new_section])
        new_seg = seg.copy()

        self.assertRaises(InvalidArgument, seg.replace_section, None,
                          new_section)
Ejemplo n.º 7
0
    def test_get_link(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(sect.link, None)

        sect2 = UnpreparedElfSection("test_link", link=sect)
        self.assertEqual(sect2.link, sect)

        sect3 = self.assertRaises(InvalidArgument,
                                  UnpreparedElfSection,
                                  "test_link",
                                  link=80)
Ejemplo n.º 8
0
 def test_get_data(self):
     data = ByteArray("pants")
     sect = UnpreparedElfSection("test", data=data)
     self.assertEquals(sect.get_data(), data)
     sect = UnpreparedElfSection("test", section_type=SHT_NOBITS)
     sect.set_size(10)
     self.assertEquals(sect.get_data(), ByteArray('\0' * 10))
Ejemplo n.º 9
0
    def test_get_size(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(sect.get_size(), 0)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        self.assertEqual(sect.get_size(), 5)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(40)
        self.assertEqual(sect.get_size(), 40)
Ejemplo n.º 10
0
 def test_init(self):
     ElfSegment()
     ElfSegment(PT_LOAD)
     ElfSegment(program_header_type=PT_LOAD)
     sections = [UnpreparedElfSection("foo")]
     self.assertRaises(TypeError,
                       ElfSegment,
                       data=ByteArray("pants"),
                       sections=sections)
Ejemplo n.º 11
0
 def test_prepare(self):
     ef = UnpreparedElfFile()
     segment = SectionedElfSegment(None, align=0x1)
     new_sect = UnpreparedElfSection(None, "pants")
     ef.add_section(new_sect)
     segment.add_section(new_sect)
     ef.add_segment(segment)
     ef.add_segment(HeaderElfSegment(None))
     ef = ef.prepare(32, '<')
Ejemplo n.º 12
0
    def test_get_section_header(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(hasattr(sect, "get_section_header"), False)
        sect = sect.prepare(0, 0, 0, 32, "<")

        sh = sect.get_section_header()
        self.assertEquals(sh.todata(), Elf32SectionHeader("<").todata())

        sect = UnpreparedElfSection("test")
        sect2 = UnpreparedElfSection("test")
        sect.link = sect2
        sect2 = sect2.prepare(0, 2, 0, 32, "<")
        sect = sect.prepare(0, 0, 0, 32, "<")
        sh = sect.get_section_header()
        self.assertEquals(sh.sh_link, 2)
Ejemplo n.º 13
0
 def test_data_append(self):
     data = ByteArray("pants")
     sect = UnpreparedElfSection("test", data=data)
     self.assertEquals(sect.get_data(), data)
     sect.data_append(ByteArray("foo"))
     self.assertEquals(sect.get_data(), ByteArray("pantsfoo"))
     sect = sect.prepare(0, 0, 0, 32, '<')
     self.assertEqual(hasattr(sect, "data_append"), False)
Ejemplo n.º 14
0
    def test_add_section(self):
        seg = DataElfSegment()
        data = ByteArray("foo")
        seg.set_data(data)
        section = UnpreparedElfSection()
        self.assertRaises(InvalidArgument, seg.add_section, section)

        seg = SectionedElfSegment()
        seg.add_section(section)
        self.assertEqual(section in seg.sections, True)
Ejemplo n.º 15
0
    def test_add_section(self):
        ef = UnpreparedElfFile()
        sect = UnpreparedElfSection()
        ef.add_section(sect)
        self.assertEqual(ef.sections[-1], sect)

        seg = HeaderElfSegment()
        self.assertRaises(InvalidArgument, seg.add_section, sect)

        seg = DataElfSegment()
        self.assertRaises(InvalidArgument, seg.add_section, sect)
Ejemplo n.º 16
0
 def test_get_data(self):
     data = ByteArray("pants")
     sect = UnpreparedElfSection("test", data=data)
     self.assertEquals(sect.get_data(), data)
     sect = UnpreparedElfSection("test", section_type=SHT_NOBITS)
     sect.set_size(10)
     self.assertEquals(sect.get_data(), ByteArray("\0" * 10))
Ejemplo n.º 17
0
 def test_data_append(self):
     data = ByteArray("pants")
     sect = UnpreparedElfSection("test", data=data)
     self.assertEquals(sect.get_data(), data)
     sect.data_append(ByteArray("foo"))
     self.assertEquals(sect.get_data(), ByteArray("pantsfoo"))
     sect = sect.prepare(0, 0, 0, 32, "<")
     self.assertEqual(hasattr(sect, "data_append"), False)
Ejemplo n.º 18
0
    def test_add_symbols(self):

        # Adding symbols to a file with no symbol table
        # should create a new symbol table
        symbols = []
        ef = UnpreparedElfFile()
        self.assertEqual(ef.get_symbol_table(), None)
        self.assertEqual(ef.get_symbols(), [])
        ef.add_symbols(symbols)
        self.assertNotEqual(ef.get_symbol_table(), None)
        # Apart from the opening null symbol, we should have nothing
        self.assertEqual(ef.get_symbols()[1:], [])

        sect_a = UnpreparedElfSection(ef)
        symbols = [ElfSymbol("a", sect_a), ElfSymbol("b", sect_a)]
        ef.add_symbols(symbols)
        self.assertEqual(ef.get_symbols()[1:], symbols)

        sect_b = UnpreparedElfSection(ef)
        symbols_b = [ElfSymbol("c", sect_b), ElfSymbol("d", sect_b)]
        ef.add_symbols(symbols_b)
        self.assertEqual(ef.section_symbols(sect_a), symbols)
        self.assertEqual(ef.section_symbols(sect_b), symbols_b)

        symbol_dict = {}
        for name in ["foo", "bar"]:
            symbol = ElfSymbol(name, sect_a)
            symbol_dict[name] = symbol
        ef.add_symbols(symbol_dict.values())

        for name in symbol_dict.keys():
            #full string match
            self.assertEqual(ef.find_symbol(name), symbol_dict[name])

            # partial suffix match
            self.assertEqual(ef.find_symbol(name[1:]), symbol_dict[name])

        self.assertEqual(ef.find_symbol("missing"), None)
Ejemplo n.º 19
0
    def test_copy(self):
        seg = DataElfSegment()
        new_seg = seg.copy()

        seg = SectionedElfSegment()
        seg.sections = [UnpreparedElfSection("test")]
        new_seg = seg.copy()

        seg = DataElfSegment()
        seg._data = ByteArray()
        new_seg = seg.copy()

        seg = DataElfSegment()
        seg.prepare(34)
        new_seg = seg.copy()

        seg = HeaderElfSegment()
        new_Seg = seg.copy()
Ejemplo n.º 20
0
    def test_remove_section(self):
        ef = UnpreparedElfFile()
        sect = UnpreparedElfSection(None)
        self.assertRaises(InvalidArgument, ef.remove_section, sect)
        ef.add_section(sect)
        self.assertEqual(sect in ef.sections, True)
        ef.remove_section(sect)
        self.assertEqual(sect in ef.sections, False)

        seg = SectionedElfSegment(None)
        ef.add_segment(seg)
        ef.add_section(sect)
        seg.add_section(sect)
        self.assertEqual(sect in ef.sections, True)
        self.assertEqual(sect in seg.sections, True)  
        ef.remove_section(sect)
        self.assertEqual(sect in ef.sections, False)
        self.assertEqual(sect in seg.sections, False)  
Ejemplo n.º 21
0
 def test_setname_prepared(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
     sect = sect.prepare(0, 0, 0, 32, '<')
     self.assertEqual(hasattr(sect, "set_name"), False)
Ejemplo n.º 22
0
 def test_get_entries(self):
     sect = UnpreparedElfSection("test", entsize=4)
     sect.data_append(ByteArray("12345678"))
     self.assertEquals(list(sect.get_entries()), [ByteArray("1234"), ByteArray("5678")])
Ejemplo n.º 23
0
 def test_set_address(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.address, 0)
     sect.address = 25
     self.assertEqual(sect.address, 25)
Ejemplo n.º 24
0
 def test_get_index(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "get_index"), False)
     sect = sect.prepare(0, 15, 0, 32, "<")
     self.assertEqual(sect.index, 15)
Ejemplo n.º 25
0
 def test_set_addralign(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.addralign, 0)
     sect.addralign = 13
     self.assertEqual(sect.addralign, 13)
Ejemplo n.º 26
0
 def test_set_info(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.info, 0)
     sect.info = 13
     self.assertEqual(sect.info, 13)
Ejemplo n.º 27
0
    def test_set_size(self):
        sect = UnpreparedElfSection("test")
        sect.set_size(37)
        self.assertEqual(sect.get_size(), 37)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        self.assertEqual(sect.get_size(), 37)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect.set_size(3)
        self.assertEqual(sect.get_size(), 3)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect.set_size(10)
        self.assertEqual(sect.get_size(), 10)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect = sect.prepare(0, 0, 0, 32, "<")
        sect.set_size(4)
        self.assertEqual(sect.get_size(), 4)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect = sect.prepare(0, 0, 0, 32, "<")
        self.assertRaises(InvalidArgument, sect.set_size, 14)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        sect = sect.prepare(0, 0, 0, 32, "<")
        self.assertRaises(InvalidArgument, sect.set_size, 69)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        sect = sect.prepare(0, 0, 0, 32, "<")
        sect.set_size(12)
        self.assertEqual(sect.get_size(), 12)
Ejemplo n.º 28
0
 def test_add_section(self):
     ef = UnpreparedElfFile()
     sect = UnpreparedElfSection(None)
     ef.add_section(sect)
     self.assertEqual(ef.sections[-1], sect)
Ejemplo n.º 29
0
 def test_repr(self):
     sect = UnpreparedElfSection("test")
     self.assertEquals(repr(sect), "<UnpreparedElfSection NULL test>")
Ejemplo n.º 30
0
 def test_get_entries(self):
     sect = UnpreparedElfSection("test", entsize=4)
     sect.data_append(ByteArray("12345678"))
     self.assertEquals(
         list(sect.get_entries()),
         [ByteArray("1234"), ByteArray("5678")])
Ejemplo n.º 31
0
    def test_get_section_header(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(hasattr(sect, "get_section_header"), False)
        sect = sect.prepare(0, 0, 0, 32, '<')

        sh = sect.get_section_header()
        self.assertEquals(sh.todata(), Elf32SectionHeader('<').todata())

        sect = UnpreparedElfSection("test")
        sect2 = UnpreparedElfSection("test")
        sect.link = sect2
        sect2 = sect2.prepare(0, 2, 0, 32, '<')
        sect = sect.prepare(0, 0, 0, 32, '<')
        sh = sect.get_section_header()
        self.assertEquals(sh.sh_link, 2)
Ejemplo n.º 32
0
 def test_get_offset(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "get_offset"), False)
     sect = sect.prepare(15, 0, 0, 32, '<')
     self.assertEqual(sect.offset, 15)
Ejemplo n.º 33
0
 def test_set_address(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.address, 0)
     sect.address = 25
     self.assertEqual(sect.address, 25)
Ejemplo n.º 34
0
 def test_setname(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
     sect.name = "pants"
     self.assertEqual(sect.name, "pants")
Ejemplo n.º 35
0
 def test_set_entsize(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.entsize, 0)
     sect.entsize = 13
     self.assertEqual(sect.entsize, 13)
Ejemplo n.º 36
0
 def test_set_addralign(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.addralign, 0)
     sect.addralign = 13
     self.assertEqual(sect.addralign, 13)
Ejemplo n.º 37
0
 def test_set_flags(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.flags, 0)
     sect.flags = 0xFF
     self.assertEqual(sect.flags, 0xFF)
Ejemplo n.º 38
0
    def test_set_size(self):
        sect = UnpreparedElfSection("test")
        sect.set_size(37)
        self.assertEqual(sect.get_size(), 37)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        self.assertEqual(sect.get_size(), 37)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect.set_size(3)
        self.assertEqual(sect.get_size(), 3)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect.set_size(10)
        self.assertEqual(sect.get_size(), 10)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect = sect.prepare(0, 0, 0, 32, '<')
        sect.set_size(4)
        self.assertEqual(sect.get_size(), 4)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        sect = sect.prepare(0, 0, 0, 32, '<')
        self.assertRaises(InvalidArgument, sect.set_size, 14)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        sect = sect.prepare(0, 0, 0, 32, '<')
        self.assertRaises(InvalidArgument, sect.set_size, 69)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(37)
        sect = sect.prepare(0, 0, 0, 32, '<')
        sect.set_size(12)
        self.assertEqual(sect.get_size(), 12)
Ejemplo n.º 39
0
 def test_set_entsize(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.entsize, 0)
     sect.entsize = 13
     self.assertEqual(sect.entsize, 13)
Ejemplo n.º 40
0
 def test_settype(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.type, SHT_NULL)
     sect.type = SHT_PROGBITS
     self.assertEqual(sect.type, SHT_PROGBITS)
Ejemplo n.º 41
0
 def test_get_offset(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "get_offset"), False)
     sect = sect.prepare(15, 0, 0, 32, "<")
     self.assertEqual(sect.offset, 15)
Ejemplo n.º 42
0
 def test_setname(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
     sect.name = "pants"
     self.assertEqual(sect.name, "pants")
Ejemplo n.º 43
0
 def test_set_info(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.info, 0)
     sect.info = 13
     self.assertEqual(sect.info, 13)
Ejemplo n.º 44
0
 def test_setname_prepared(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
     sect = sect.prepare(0, 0, 0, 32, "<")
     self.assertEqual(hasattr(sect, "set_name"), False)
Ejemplo n.º 45
0
 def test_set_flags(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.flags, 0)
     sect.flags = 0xff
     self.assertEqual(sect.flags, 0xff)
Ejemplo n.º 46
0
 def test_getname(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(sect.name, "test")
Ejemplo n.º 47
0
    def test_get_size(self):
        sect = UnpreparedElfSection("test")
        self.assertEqual(sect.get_size(), 0)

        sect = UnpreparedElfSection("test", data=ByteArray("pants"))
        self.assertEqual(sect.get_size(), 5)

        sect = UnpreparedElfSection("test", SHT_NOBITS)
        sect.set_size(40)
        self.assertEqual(sect.get_size(), 40)
Ejemplo n.º 48
0
 def test_get_index(self):
     sect = UnpreparedElfSection("test")
     self.assertEqual(hasattr(sect, "get_index"), False)
     sect = sect.prepare(0, 15, 0, 32, '<')
     self.assertEqual(sect.index, 15)