diff options
Diffstat (limited to 'tests')
| -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() | 
