diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-05-11 19:09:07 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-05-11 19:09:07 (GMT) |
commit | 8ee7fc5db965adaa835ca87bb3d2e2d43e52fbbb (patch) | |
tree | c4b89d08fe59b5970626fc22a868ff1a0f09af16 /tests/format/elf | |
parent | 81aec19816e053d37cea882544ca35d2203a3c5b (diff) |
Handled preloaded instructions located in two cut areas (ELF overlapping).
Diffstat (limited to 'tests/format/elf')
-rw-r--r-- | tests/format/elf/Makefile | 5 | ||||
-rw-r--r-- | tests/format/elf/overlapping_areas.asm | 115 | ||||
-rw-r--r-- | tests/format/elf/overlapping_areas.py | 62 |
3 files changed, 181 insertions, 1 deletions
diff --git a/tests/format/elf/Makefile b/tests/format/elf/Makefile index c32392f..8695bb1 100644 --- a/tests/format/elf/Makefile +++ b/tests/format/elf/Makefile @@ -1,11 +1,14 @@ -EXECUTABLES=oob_section_name +EXECUTABLES=oob_section_name overlapping_areas all: $(EXECUTABLES) oob_section_name: oob_section_name.o $(ARM_CROSS)objcopy $< -O binary $@ +overlapping_areas: overlapping_areas.o + $(ARM_CROSS)objcopy $< -O binary $@ + %.o: %.asm $(ARM_CROSS)as -c $< -o $@ diff --git a/tests/format/elf/overlapping_areas.asm b/tests/format/elf/overlapping_areas.asm new file mode 100644 index 0000000..debcca1 --- /dev/null +++ b/tests/format/elf/overlapping_areas.asm @@ -0,0 +1,115 @@ + +.macro bump addr + .word \addr + 0x200000 +.endm + +.macro label_offset lbl + .word \lbl - str_table +.endm + + +elf_header: + + .byte 0x7F, 'E', 'L', 'F' @ e_ident + .byte 1 @ EI_CLASS => ELFCLASS32 + .byte 1 @ EI_DATA => ELFDATA2LSB + .byte 1 @ EI_VERSION => EV_CURRENT + .byte 0 @ EI_OSABI => ELFOSABI_SYSV + .byte 0 @ EI_ABIVERSION + + .word 0 + .short 0 + .byte 0 + + .short 2 @ e_type => ET_EXEC + .short 40 @ e_machine => EM_ARM + .word 1 @ e_version => EV_CURRENT + bump main @ e_entry + + .word program_headers @ e_phoff + .word section_headers @ e_shoff + + .word 0x80 @ e_flags => EF_ARM_NEW_ABI + + .short 52 @ e_ehsize + .short 32 @ e_phentsize + .short 2 @ e_phnum + .short 40 @ e_shentsize + .short 2 @ e_shnum + .short 1 @ e_shstrndx + + +program_headers: + + .word 1 @ p_type => PT_LOAD + .word O @ p_offset + .word 0x200000 @ p_vaddr + .word 0x200000 @ p_paddr + .word bss_start @ p_filesz + .word bss_start @ p_memsz + .word 0x5 @ p_flags => PF_X | PF_R + .word 0x1000 @ p_align + + .word 1 @ p_type => PT_LOAD + .word bss_start @ p_offset + .word 0x300000 @ p_vaddr + .word 0x300000 @ p_paddr + .word bss_end - bss_start @ p_filesz + .word bss_end - bss_start @ p_memsz + .word 0x6 @ p_flags => PF_W | PF_R + .word 0x1 @ p_align + + +section_headers: + + label_offset text_lbl @ sh_name + .word 1 @ sh_type => SHT_PROGBITS + .word 0x6 @ sh_flags => SHF_ALLOC | SHF_EXECINSTR + bump main @ sh_addr + .word main @ sh_offset + .word main_return - main @ sh_size + .word 0 @ sh_link + .word 0 @ sh_info + .word 4 @ sh_addralign + .word 0 @ sh_entsize + + label_offset strtab_lbl @ sh_name + .word 3 @ sh_type => SHT_STRTAB + .word 0x0 @ sh_flags + .word 0x0 @ sh_addr + .word str_table @ sh_offset + .word str_table_end - str_table @ sh_size + .word 0 @ sh_link + .word 0 @ sh_info + .word 1 @ sh_addralign + .word 0 @ sh_entsize + + +main: + mov r7, #1 @ __NR_exit + mov r0, #42 @ $? + svc 0 + +main_return: + + +bss_start: + + .word 0x0 + .word 0x0 + .word 0x0 + .word 0x0 + +str_table: + + .byte 0, 0 +text_lbl: + .byte '.', 't', 'e', 'x', 't', 0 +strtab_lbl: + .byte '.', 's', 't', 'r', 't', 'a', 'b', 0 +blabla: + .byte 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A' +bss_end: + .byte 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 0 + +str_table_end: diff --git a/tests/format/elf/overlapping_areas.py b/tests/format/elf/overlapping_areas.py new file mode 100644 index 0000000..4c78625 --- /dev/null +++ b/tests/format/elf/overlapping_areas.py @@ -0,0 +1,62 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + +# Il arrive que les segments englobent partiellement des sections. +# +# Cela peut être problématique si une section contient une chaîne de taille +# n qui se retrouve à cheval sur deux zones (la section des chaînes découpée +# en deux par exemple). +# +# Au moment d'associer l'instruction chargée à la zone de départ, cette +# dernière n'est pas assez grande car elle ne représente pas la section +# en entier. + + +from chrysacase import ChrysalideTestCase +from pychrysalide.analysis import LoadedBinary +from pychrysalide.analysis.contents import FileContent +from threading import Event +import os +import sys + + +class TestOverlappingAreas(ChrysalideTestCase): + """TestCase for BSS segment overlapping string section.""" + + @classmethod + def setUpClass(cls): + + super(TestOverlappingAreas, cls).setUpClass() + + cls.log('Compile binary "overlapping_areas" if needed...') + + fullname = sys.modules[cls.__module__].__file__ + dirpath = os.path.dirname(fullname) + + os.system('make -C %s overlapping_areas 2>&1 > /dev/null' % dirpath) + + + def testOOBSectionName(self): + """Avoid crashing because of overlapping binary areas.""" + + fullname = sys.modules[self.__class__.__module__].__file__ + filename = os.path.basename(fullname) + + baselen = len(fullname) - len(filename) + + cnt = FileContent(fullname[:baselen] + 'overlapping_areas') + self.assertIsNotNone(cnt) + + binary = LoadedBinary(cnt) + + def disass_done(binary): + worker.set() + + binary.connect('disassembly-done', disass_done) + + worker = Event() + + binary.analyse() + + worker.wait() |