summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/format/elf/Makefile5
-rw-r--r--tests/format/elf/overlapping_areas.asm115
-rw-r--r--tests/format/elf/overlapping_areas.py62
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()