summaryrefslogtreecommitdiff
path: root/tests/format
diff options
context:
space:
mode:
Diffstat (limited to 'tests/format')
-rw-r--r--tests/format/elf/Makefile16
-rw-r--r--tests/format/elf/non_existing_binary.py26
-rw-r--r--tests/format/elf/oob_section_name.asm94
-rw-r--r--tests/format/elf/oob_section_name.py24
4 files changed, 160 insertions, 0 deletions
diff --git a/tests/format/elf/Makefile b/tests/format/elf/Makefile
new file mode 100644
index 0000000..b14ff47
--- /dev/null
+++ b/tests/format/elf/Makefile
@@ -0,0 +1,16 @@
+
+EXECUTABLES=tiny oob_section_name
+
+all: $(EXECUTABLES)
+
+tiny: tiny.o
+ $(ARM_CROSS)objcopy $< -O binary $@
+
+oob_section_name: oob_section_name.o
+ $(ARM_CROSS)objcopy $< -O binary $@
+
+%.o: %.asm
+ $(ARM_CROSS)as -c $< -o $@
+
+clean:
+ rm -f *.o $(EXECUTABLES)
diff --git a/tests/format/elf/non_existing_binary.py b/tests/format/elf/non_existing_binary.py
new file mode 100644
index 0000000..47c9028
--- /dev/null
+++ b/tests/format/elf/non_existing_binary.py
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+
+# Eprouve quelques mécanismes de construction côté Python.
+
+
+import pychrysalide
+
+from pychrysalide.analysis.contents import FileContent
+from pychrysalide.format.elf import ElfFormat
+
+cnt = FileContent("non_existing_binary")
+
+print(cnt)
+
+print(cnt == None)
+
+try:
+ fmt = ElfFormat(cnt)
+except TypeError as e:
+ fmt = None
+
+print(fmt)
+
+print(fmt == None)
diff --git a/tests/format/elf/oob_section_name.asm b/tests/format/elf/oob_section_name.asm
new file mode 100644
index 0000000..ad5b599
--- /dev/null
+++ b/tests/format/elf/oob_section_name.asm
@@ -0,0 +1,94 @@
+
+.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 1 @ 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 file_size @ p_filesz
+ .word file_size @ p_memsz
+ .word 0x5 @ p_flags => PF_X | PF_R
+ .word 0x1000 @ p_align
+
+
+section_headers:
+
+ .word 0xa0000000 @ 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 file_size - 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 0xb0000000 @ sh_size
+ .word 0 @ sh_link
+ .word 0 @ sh_info
+ .word 1 @ sh_addralign
+ .word 0 @ sh_entsize
+
+
+str_table:
+
+ .byte 0, 0
+text_lbl:
+ .byte '.', 't', 'e', 'x', 't', 0
+strtab_lbl:
+ .byte '.', 's', 't', 'r', 't', 'a', 'b', 0
+
+
+main:
+ mov r7, #1 @ __NR_exit
+ mov r0, #42 @ $?
+ svc 0
+
+
+file_size:
diff --git a/tests/format/elf/oob_section_name.py b/tests/format/elf/oob_section_name.py
new file mode 100644
index 0000000..da58e29
--- /dev/null
+++ b/tests/format/elf/oob_section_name.py
@@ -0,0 +1,24 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+
+# Une section peut avoir un index pour son nom démesurément grand (et invalide).
+#
+# Si la section des chaînes de caractères est toute aussi grande et invalide,
+# l'index invalide reste suffisamment cohérent pour passer les premiers tests
+# de extract_name_from_elf_string_section() et conduire ensuite à un plantage
+# lors de l'accès concret, au moment de l'appel à strlen().
+
+
+import pychrysalide
+
+from pychrysalide.analysis.contents import FileContent
+from pychrysalide.format.elf import ElfFormat
+
+cnt = FileContent("oob_section_name")
+
+fmt = ElfFormat(cnt)
+
+print(fmt)
+
+print(isinstance(fmt, ElfFormat))