diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/format/elf/Makefile | 9 | ||||
| -rw-r--r-- | tests/format/elf/strings.asm | 77 | ||||
| -rw-r--r-- | tests/format/elf/strings.py | 74 | 
3 files changed, 159 insertions, 1 deletions
| diff --git a/tests/format/elf/Makefile b/tests/format/elf/Makefile index 8695bb1..0511308 100644 --- a/tests/format/elf/Makefile +++ b/tests/format/elf/Makefile @@ -1,5 +1,5 @@ -EXECUTABLES=oob_section_name overlapping_areas +EXECUTABLES=oob_section_name overlapping_areas strings  all: $(EXECUTABLES) @@ -9,6 +9,13 @@ oob_section_name: oob_section_name.o  overlapping_areas: overlapping_areas.o  	$(ARM_CROSS)objcopy $< -O binary $@ +strings: strings.asm +	grep .global strings.asm | cut -d ' ' -f 2 > keep.lst +	$(ARM_CROSS)as -o strings.o strings.asm +	$(ARM_CROSS)ld -s --retain-symbols-file=keep.lst -o strings strings.o +	rm -f keep.lst + +  %.o: %.asm  	$(ARM_CROSS)as -c $< -o $@ diff --git a/tests/format/elf/strings.asm b/tests/format/elf/strings.asm new file mode 100644 index 0000000..d9a75d3 --- /dev/null +++ b/tests/format/elf/strings.asm @@ -0,0 +1,77 @@ + +.data + +.global msg +.global no_arg_msg +.global got_arg_msg + +msg: +    .ascii      "Hello, ARM!\n" + +len = . - msg + +no_arg_msg: +    .ascii      "No command line argument...\n" + +no_arg_len = . - no_arg_msg + +got_arg_msg: +    .ascii      "Got command line argument(s)...\n" + +got_arg_len = . - got_arg_msg + +.text + +.global do_syscalls + +do_syscalls: + +    /** +     * syscall write(int fd, const void *buf, size_t count) +     */ + +    mov     %r0, $1     /* fd -> stdout */ +    ldr     %r1, =msg   /* buf -> msg */ +    ldr     %r2, =len   /* count -> len(msg) */ +    mov     %r7, $4     /* write is syscall #4 */ +    swi     $0          /* invoke syscall */ + +    /** +     * syscall write(int fd, const void *buf, size_t count) +     */ + +    mov     %r0, $2     /* fd -> stderr */ +    mov     %r7, $4     /* write is syscall #4 */ + +    ldr     %r3, [sp]   /* argc */ +    cmp     %r3, $1 + +    beq     no_arg + +    ldr     %r1, =got_arg_msg   /* buf -> msg */ +    ldr     %r2, =got_arg_len   /* count -> len(msg) */ + +    b       process_arg + +no_arg: + +    ldr     %r1, =no_arg_msg   /* buf -> msg */ +    ldr     %r2, =no_arg_len   /* count -> len(msg) */ + +process_arg: + +    swi     $0          /* invoke syscall */ + +    /** +     * syscall exit(int status) +     */ + +    mov     %r0, $123   /* status -> 0 */ +    mov     %r7, $1     /* exit is syscall #1 */ +    swi     $0          /* invoke syscall */ + +.global _start + +_start: + +    bl      do_syscalls diff --git a/tests/format/elf/strings.py b/tests/format/elf/strings.py new file mode 100644 index 0000000..0e09d75 --- /dev/null +++ b/tests/format/elf/strings.py @@ -0,0 +1,74 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + + +# S'assure que les chaînes présentes sont bien chargées en tant que telles. + + +from chrysacase import ChrysalideTestCase +from pychrysalide.analysis.contents import FileContent +from pychrysalide.analysis import LoadedBinary +from pychrysalide.arch import RawInstruction +from threading import Event +import os +import sys + + +class TestElfString(ChrysalideTestCase): +    """TestCase for ELF strings.""" + +    @classmethod +    def setUpClass(cls): + +        super(TestElfString, cls).setUpClass() + +        cls.log('Compile binary "strings" if needed...') + +        fullname = sys.modules[cls.__module__].__file__ +        dirpath = os.path.dirname(fullname) + +        os.system('make -C %s strings 2>&1 > /dev/null' % dirpath) + + +    def testElfStrings(self): +        """Ensure available strings are loaded as strings.""" + +        fullname = sys.modules[self.__class__.__module__].__file__ +        filename = os.path.basename(fullname) + +        baselen = len(fullname) - len(filename) + +        cnt = FileContent(fullname[:baselen] + 'strings') +        self.assertIsNotNone(cnt) + +        binary = LoadedBinary(cnt) +        self.assertIsNotNone(binary) + +        def disass_done(binary): +            worker.set() + +        binary.connect('disassembly-done', disass_done) + +        worker = Event() + +        binary.analyse() + +        worker.wait() + +        expected = { +            'hello_arm_str'        : False, +            'no_command_line_str'  : False, +            'got_command_line_str' : False +        } + +        for sym in binary.format.symbols: + +            if sym.label in expected.keys(): + +                ins = binary.processor.find_instr_by_addr(sym.range.addr) + +                if type(ins) is RawInstruction: +                    expected[sym.label] = ins.is_string + +        for k in expected.keys(): +            self.assertTrue(expected[k]) | 
