Oberdan Parodi

43 papers B 1C 4Misc 2Journal 19Unranked 17
YearRankTypeTitle / Venue / Authors
2021 J jnl
Comput. Methods Programs Biomed.
Tijana Djukic, Igor Saveljic, Gualtiero Pelosi, Oberdan Parodi, Nenad Filipovic
2019 Misc conf
OZCHI
Marina Buzzi, Franca Giugni, Oberdan Parodi, Beatrice Rapisarda, Federico Vozzi
2019 J jnl
Comput. Methods Programs Biomed.
Tijana Djukic, Igor Saveljic, Gualtiero Pelosi, Oberdan Parodi, Nenad Filipovic
2019 C conf
BIBE
Tijana Djukic, Igor Saveljic, Gualtiero Pelosi, Oberdan Parodi, Nenad Filipovic
2018 J jnl
Biomed. Signal Process. Control.
Vassiliki Kigka, George Rigas, Antonis I. Sakellarios, Panagiotis K. Siogkas, Ioannis O. Andrikos, Themis P. Exarchos, Dimitra Loggitsi, Constantinos D. Anagnostopoulos, Lampros K. Michalis, Danilo Neglia, Gualtiero Pelosi, Oberdan Parodi, Dimitrios I. Fotiadis
2018 conf
EMBC
Antonis I. Sakellarios, Panagiotis K. Siogkas, Eleni I. Georga, Nikolaos S. Tachos, Vassiliki Kigka, Panagiota Tsompou, Ioannis O. Andrikos, Georgia S. Karanasiou, Silvia Rocchiccioli, Joao Correia, Gualtiero Pelosi, Paolo Stofella, Nenad Filipovic, Oberdan Parodi, Dimitrios I. Fotiadis
2018 conf
EMBC
Vassiliki I. Kigka, Eleni I. Georga, Antonis I. Sakellarios, Nikolaos S. Tachos, Ioannis O. Andrikos, Panagiota Tsompou, Silvia Rocchiccioli, Gualtiero Pelosi, Oberdan Parodi, Lampros K. Michalis, Dimitrios I. Fotiadis
2017 J jnl
Eng. Appl. Artif. Intell.
Davide Bacciu, Stefano Chessa, Claudio Gallicchio, Alessio Micheli, Luca Pedrelli, Erina Ferro, Luigi Fortunati, Davide La Rosa, Filippo Palumbo, Federico Vozzi, Oberdan Parodi
2017 conf
EMBC
Panagiotis K. Siogkas, George Rigas, Themis P. Exarchos, Antonis I. Sakellarios, Michail I. Papafaklis, Gualtiero Pelosi, Oberdan Parodi, Lampros K. Michalis, Dimitrios I. Fotiadis
2017 C conf
BIBE
Velibor Isailovic, Zarko Milosevic, Dalibor Nikolic, Igor Saveljic, Milica M. Nikolic, Marija Gacic, Bojana R. Cirkovic-Andjelkovic, Themis P. Exarchos, Dimitrios I. Fotiadis, Gualtiero Pelosi, Oberdan Parodi, Nenad Filipovic
2017 J jnl
IEEE Trans. Biomed. Eng.
Antonis I. Sakellarios, Lorenz Räber, Christos V. Bourantas, Themis P. Exarchos, Lambros S. Athanasiou, Gualtiero Pelosi, Konstantinos C. Koskinas, Oberdan Parodi, Katerina K. Naka, Lampros K. Michalis, Patrick W. Serruys, Hector M. Garcia-Garcia, Stephan Windecker, Dimitrios I. Fotiadis
2017 conf
FABULOUS
Bojana R. Andjelkovic Cirkovic, Velibor Isailovic, Dalibor Nikolic, Igor Saveljic, Oberdan Parodi, Nenad Filipovic
2017 J jnl
J. Reliab. Intell. Environ.
Filippo Palumbo, Davide La Rosa, Erina Ferro, Davide Bacciu, Claudio Gallicchio, Alessio Micheli, Stefano Chessa, Federico Vozzi, Oberdan Parodi
2017 conf
EMBC
Antonis I. Sakellarios, George Rigas, Vassiliki Kigka, Panagiotis K. Siogkas, Panagiota Tsompou, Georgia S. Karanasiou, Themis P. Exarchos, Ioannis O. Andrikos, Nikolaos S. Tachos, Gualtiero Pelosi, Oberdan Parodi, Dimitrios I. Fotiadis
2016 B conf
Intelligent Environments
Davide Bacciu, Stefano Chessa, Erina Ferro, Luigi Fortunati, Claudio Gallicchio, Davide La Rosa, Miguel Llorente, Alessio Micheli, Filippo Palumbo, Oberdan Parodi, Andrea Valenti, Federico Vozzi
2016 J jnl
BMC Medical Imaging
Lambros S. Athanasiou, George Rigas, Antonis I. Sakellarios, Themis P. Exarchos, Panagiotis K. Siogkas, Christos V. Bourantas, Hector M. Garcia-Garcia, Pedro A. Lemos, Breno A. Falcao, Lampros K. Michalis, Oberdan Parodi, Federico Vozzi, Dimitrios I. Fotiadis
2015 J jnl
IEEE J. Biomed. Health Informatics
Konstantinos P. Exarchos, Clara Carpegianni, Georgios Rigas, Themis P. Exarchos, Federico Vozzi, Antonis I. Sakellarios, Paolo Marraccini, Katerina K. Naka, Lampros K. Michalis, Oberdan Parodi, Dimitrios I. Fotiadis
2015 conf
AALTD@PKDD/ECML (Revised Selected Papers)
Claudio Gallicchio, Alessio Micheli, Luca Pedrelli, Luigi Fortunati, Federico Vozzi, Oberdan Parodi
2015 C conf
BIBE
Milos D. Radovic, Velibor Isailovic, Igor Saveljic, Zarko Milosevic, Dalibor Nikolic, Themis P. Exarchos, Dimitrios I. Fotiadis, Oberdan Parodi, Nenad Filipovic
2015 J jnl
Comput. Biol. Medicine
Lambros S. Athanasiou, George A. Rigas, Antonis I. Sakellarios, Themis P. Exarchos, Panagiotis K. Siogkas, Katerina K. Naka, Daniele Panetta, Gualtiero Pelosi, Federico Vozzi, Lampros K. Michalis, Oberdan Parodi, Dimitrios I. Fotiadis
2015 J jnl
Comput. Methods Programs Biomed.
Lambros S. Athanasiou, George Rigas, Antonis I. Sakellarios, Christos V. Bourantas, Kostas A. Stefanou, Evangelos Fotiou, Themis P. Exarchos, Panagiotis K. Siogkas, Katerina K. Naka, Oberdan Parodi, Federico Vozzi, Zhongzhao Teng, Victoria E. L. Young, Jonathan Gillard, Francesco Prati, Lampros K. Michalis, Dimitrios I. Fotiadis
2015 conf
AALTD@PKDD/ECML
Claudio Gallicchio, Alessio Micheli, Luca Pedrelli, Federico Vozzi, Oberdan Parodi
2015 Misc conf
EPIA
Davide Bacciu, Stefano Chessa, Claudio Gallicchio, Alessio Micheli, Erina Ferro, Luigi Fortunati, Filippo Palumbo, Oberdan Parodi, Federico Vozzi, Sten Hanke, Johannes Kropf, Karl Kreiner
2015 conf
EMBC
Lambros S. Athanasiou, George A. Rigas, Antonios I. Sakellarios, Themis P. Exarchos, Panagiotis K. Siogkas, Lampros K. Michalis, Oberdan Parodi, Federico Vozzi, Dimitrios I. Fotiadis
2015 conf
EMBC
Panagiotis K. Siogkas, Lambros S. Athanasiou, Antonis I. Sakellarios, Kostas A. Stefanou, Themis P. Exarchos, Michail I. Papafaklis, Katerina K. Naka, Oberdan Parodi, Lampros K. Michalis, Dimitrios I. Fotiadis
2014 conf
EMBC
George A. Rigas, Lambros S. Athanasiou, Antonios I. Sakellarios, Themis P. Exarchos, Panagiotis K. Siogkas, Katerina K. Naka, Daniele Panetta, Gualtiero Pelosi, Lampros K. Michalis, Oberdan Parodi, Dimitrios I. Fotiadis
2013 conf
EMBC
Panagiotis K. Siogkas, Michail I. Papafaklis, Antonis I. Sakellarios, Kostas A. Stefanou, Christos V. Bourantas, Lambros M. Athanasiou, Christos V. Bellos, Themis P. Exarchos, Katerina K. Naka, Lampros K. Michalis, Oberdan Parodi, Dimitrios I. Fotiadis
2013 J jnl
Medical Biol. Eng. Comput.
Nenad Filipovic, Zhongzhao Teng, Milos D. Radovic, Igor Saveljic, Dimitrios I. Fotiadis, Oberdan Parodi
2013 C conf
BIBE
Antonis I. Sakellarios, Panagiotis K. Siogkas, Lambros S. Athanasiou, Themis P. Exarchos, Michail I. Papafaklis, Christos V. Bourantas, Katerina K. Naka, Dimitra Iliopoulou, Lampros K. Michalis, Nenad Filipovic, Oberdan Parodi, Dimitrios I. Fotiadis
2013 conf
EMBC
Konstantinos P. Exarchos, Themis P. Exarchos, Christos V. Bourantas, Michail I. Papafaklis, Katerina K. Naka, Lampros K. Michalis, Oberdan Parodi, Dimitrios I. Fotiadis
2013 conf
EMBC
Antonis I. Sakellarios, Panagiotis K. Siogkas, Lambros S. Athanasiou, Themis P. Exarchos, Michail I. Papafaklis, Christos V. Bourantas, Katerina K. Naka, Lampros K. Michalis, Nenad Filipovic, Oberdan Parodi, Dimitrios I. Fotiadis
2012 J jnl
IEEE Trans. Inf. Technol. Biomed.
Nenad Filipovic, Mirko Rosic, Irena Tanaskovic, Zarko Milosevic, Dalibor Nikolic, Nebojsa Zdravkovic, Aleksandar Peulic, Milos Kojic, Dimitrios I. Fotiadis, Oberdan Parodi
2012 J jnl
IEEE Trans. Inf. Technol. Biomed.
Craig J. Hartley, Morteza Naghavi, Oberdan Parodi, Constantinos S. Pattichis, Carmen C. Y. Poon, Yuan-Ting Zhang
2012 conf
EMBC
Themis P. Exarchos, Antonis I. Sakellarios, Panagiotis K. Siogkas, Dimitrios I. Fotiadis, Zarko Milosevic, Dalibor Nikolic, Nenad Filipovic, Paolo Marraccini, Federico Vozzi, Oberdan Parodi
2012 J jnl
IEEE Trans. Inf. Technol. Biomed.
Oberdan Parodi, Themis P. Exarchos, Paolo Marraccini, Federico Vozzi, Zarko Milosevic, Dalibor Nikolic, Antonis I. Sakellarios, Panagiotis K. Siogkas, Dimitrios I. Fotiadis, Nenad Filipovic
2011 conf
EMBC
Nenad Filipovic, Mirko Rosic, Irena Tanaskovic, Oberdan Parodi, Dimitris I. Fotiadis
2011 J jnl
IEEE Trans. Biomed. Eng.
Panagiotis K. Siogkas, Antonis I. Sakellarios, Themis P. Exarchos, Lambros S. Athanasiou, Evaggelos Karvounis, Kostas A. Stefanou, Evangelos Fotiou, Dimitrios I. Fotiadis, Katerina K. Naka, Lampros K. Michalis, Nenad Filipovic, Oberdan Parodi
2011 conf
EMBC
Themis P. Exarchos, Yorgos Goletsis, Kostas A. Stefanou, Evangelos Fotiou, Dimitrios I. Fotiadis, Oberdan Parodi
2010 J jnl
IEEE Trans. Biomed. Eng.
Raffaele Ponzini, Christian Vergara, Giovanna Rizzo, Alessandro Veneziani, Alberto Roghi, Angelo Vanzulli, Oberdan Parodi, Alberto Redaelli
2010 J jnl
Comput. Methods Programs Biomed.
Christian Vergara, Raffaele Ponzini, Alessandro Veneziani, Alberto Redaelli, Danilo Neglia, Oberdan Parodi
1998 J jnl
IEEE Trans. Biomed. Eng.
Alessandra Bertoldo, Paolo Vicini, Gianmario Sambuceti, Adriaan A. Lammertsma, Oberdan Parodi, Claudio Cobelli
1997 conf
HPCN Europe
Maria Filomena Santarelli, Vincenzo Positano, Luigi Landini, Oberdan Parodi, Thomas Serafini
1996 J jnl
Biol. Cybern.
Oberdan Parodi, P. Combe, J.-C. Ducom
redb/extractors/elf_extractor.py
← Index redb/extractors/elf_extractor.py python
import logging
from abc import ABCMeta, abstractmethod
import inspect

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.extractor import Extractor

logger = logging.getLogger(__name__)


@abstractmethod
class ELFExtractor(Extractor, metaclass=ABCMeta):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious
        )
        # Store ELF object if provided, otherwise we'll create it per-operation for security
        self._provided_elf = elf
        self._elf_file_valid = None  # Cache validity check

    def _with_elf_file(self, operation):
        """Safely execute an operation with an ELF file using context manager.

        Args:
            operation: A callable that takes an ELFFile object and returns a result

        Returns:
            The result of the operation, or None if an error occurred
        """
        if self._provided_elf:
            try:
                return operation(self._provided_elf)
            except ELFError as e:
                if "String Table not found" in str(e):
                    self.log.warning(f"String table missing in ELF {self.hash.sha256}: {e}")
                    return None
                else:
                    self.log.error(f"ELF format error {self.hash.sha256} Full error: {e}")
                    return None
            except Exception as e:
                self.log.error(f"Error processing ELF file {self.hash.sha256} Full error: {e}")
                return None

        try:
            with open(self.filepath, 'rb') as f:
                elf = ELFFile(f)
                if not elf:
                    raise ELFError("Empty file?")
                return operation(elf)
        except ELFError as e:
            if "String Table not found" in str(e):
                self.log.warning(f"String table missing in ELF {self.hash.sha256}: {e}")
                return None
            else:
                self.log.error(f"ELF format error {self.hash.sha256} Full error: {e}")
                return None
        except Exception as e:
            self.log.error(f"Error reading ELF file {self.hash.sha256} Full error: {e}")
            return None

    def _is_elf_file(self):
        """Check if the file is a valid ELF binary."""
        if self._elf_file_valid is not None:
            return self._elf_file_valid

        def check_elf_validity(elf):
            # pyelftools ELFFile object existing means it's valid ELF
            # Just check that we can access the header
            header = elf.header
            return header is not None

        try:
            result = self._with_elf_file(check_elf_validity)
            self._elf_file_valid = bool(result)
            return self._elf_file_valid
        except Exception as e:
            self.log.error(f"Error checking ELF file: {e}")
            self._elf_file_valid = False
            return False

    def _is_64bit(self):
        """Check if the ELF binary is 64-bit."""
        def check_64bit(elf):
            return elf.header.get('e_ident', {}).get('EI_CLASS') == 'ELFCLASS64'

        try:
            result = self._with_elf_file(check_64bit)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking ELF bitness: {e}")
            return False

    def _is_stripped(self):
        """Check if the ELF binary is stripped (no symbol table)."""
        def check_stripped(elf):
            # Look for symbol table sections
            for section in elf.iter_sections():
                if section.name in ['.symtab', '.strtab']:
                    return False
            return True

        try:
            result = self._with_elf_file(check_stripped)
            return result if result is not None else True
        except Exception as e:
            self.log.error(f"Error checking if ELF is stripped: {e}")
            return True

    def _has_debug_info(self):
        """Check if the ELF binary contains debug information."""
        def check_debug_info(elf):
            # Look for debug sections
            debug_sections = ['.debug_info', '.debug_line', '.debug_str', '.debug_abbrev']
            for section in elf.iter_sections():
                if section.name in debug_sections:
                    return True
            return False

        try:
            result = self._with_elf_file(check_debug_info)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking debug info: {e}")
            return False

    def _get_architecture(self):
        """Get the architecture of the ELF binary."""
        def get_arch(elf):
            machine = elf.header.get('e_machine', 'EM_NONE')

            # Map common machine types to readable names
            arch_map = {
                'EM_386': 'x86',
                'EM_X86_64': 'x86_64',
                'EM_ARM': 'ARM',
                'EM_AARCH64': 'ARM64',
                'EM_MIPS': 'MIPS',
                'EM_PPC': 'PowerPC',
                'EM_PPC64': 'PowerPC64',
                'EM_SPARC': 'SPARC',
                'EM_RISCV': 'RISC-V'
            }

            return arch_map.get(machine, machine)

        try:
            result = self._with_elf_file(get_arch)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting architecture: {e}")
            return "unknown"

    def _get_endianness(self):
        """Get the endianness of the ELF binary."""
        def get_endian(elf):
            data_encoding = elf.header.get('e_ident', {}).get('EI_DATA')
            if data_encoding == 'ELFDATA2LSB':
                return "little"
            elif data_encoding == 'ELFDATA2MSB':
                return "big"
            return "unknown"

        try:
            result = self._with_elf_file(get_endian)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting endianness: {e}")
            return "unknown"

    def _get_file_type(self):
        """Get the file type of the ELF binary."""
        def get_file_type(elf):
            etype = elf.header.get('e_type', 'ET_NONE')

            # Map file types to readable names
            type_map = {
                'ET_NONE': 'none',
                'ET_REL': 'relocatable',
                'ET_EXEC': 'executable',
                'ET_DYN': 'shared_object',
                'ET_CORE': 'core_dump'
            }

            return type_map.get(etype, etype)

        try:
            result = self._with_elf_file(get_file_type)
            return result if result is not None else "unknown"
        except Exception as e:
            self.log.error(f"Error getting file type: {e}")
            return "unknown"

    def _is_pie(self):
        """Check if the ELF binary is position-independent executable."""
        def check_pie(elf):
            # PIE binaries are typically ET_DYN type
            etype = elf.header.get('e_type', 'ET_NONE')
            if etype == 'ET_DYN':
                # Check if it has an entry point (executable) vs library
                entry_point = elf.header.get('e_entry', 0)
                return entry_point > 0
            return False

        try:
            result = self._with_elf_file(check_pie)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking PIE: {e}")
            return False

    def _has_stack_protection(self):
        """Check if the binary has stack protection (canaries)."""
        def check_stack_protection(elf):
            # Look for stack protection symbols
            stack_symbols = ['__stack_chk_fail', '__stack_chk_guard']

            for section in elf.iter_sections():
                if hasattr(section, 'iter_symbols'):
                    for symbol in section.iter_symbols():
                        if symbol.name in stack_symbols:
                            return True
            return False

        try:
            result = self._with_elf_file(check_stack_protection)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking stack protection: {e}")
            return False

    def _has_nx_bit(self):
        """Check if the binary has NX bit (non-executable stack)."""
        def check_nx_bit(elf):
            # Look for GNU_STACK segment
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_GNU_STACK':
                    flags = segment.header.get('p_flags', 0)
                    # Check if execute flag is NOT set (NX enabled)
                    return not (flags & 0x1)  # PF_X = 0x1
            return False

        try:
            result = self._with_elf_file(check_nx_bit)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking NX bit: {e}")
            return False

    def _has_relro(self):
        """Check if the binary has RELRO (Relocation Read-Only)."""
        def check_relro(elf):
            # Look for GNU_RELRO segment
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_GNU_RELRO':
                    return True
            return False

        try:
            result = self._with_elf_file(check_relro)
            return bool(result)
        except Exception as e:
            self.log.error(f"Error checking RELRO: {e}")
            return False

    def _get_build_id(self):
        """Extract build ID from notes section."""
        def get_build_id(elf):
            # Look for build ID in notes sections
            for section in elf.iter_sections():
                if section.name == '.note.gnu.build-id':
                    for note in section.iter_notes():
                        if note['n_type'] == 'NT_GNU_BUILD_ID':
                            # Convert bytes to hex string
                            build_id = note['n_desc']
                            if isinstance(build_id, bytes):
                                return build_id.hex()
                            return str(build_id)
            return None

        try:
            result = self._with_elf_file(get_build_id)
            return result
        except Exception as e:
            self.log.error(f"Error getting build ID: {e}")
            return None

    def _count_sections(self):
        """Count the number of sections in the ELF file."""
        def count_sections(elf):
            return elf.header.get('e_shnum', 0)

        try:
            result = self._with_elf_file(count_sections)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting sections: {e}")
            return 0

    def _count_segments(self):
        """Count the number of segments (program headers) in the ELF file."""
        def count_segments(elf):
            return elf.header.get('e_phnum', 0)

        try:
            result = self._with_elf_file(count_segments)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting segments: {e}")
            return 0

    def _count_symbols(self):
        """Count the total number of symbols in symbol tables."""
        def count_symbols(elf):
            symbol_count = 0
            for section in elf.iter_sections():
                if hasattr(section, 'iter_symbols'):
                    symbol_count += section.num_symbols()
            return symbol_count

        try:
            result = self._with_elf_file(count_symbols)
            return result if result is not None else 0
        except Exception as e:
            self.log.error(f"Error counting symbols: {e}")
            return 0

    def _get_dependencies(self):
        """Get list of dynamic dependencies."""
        def get_dependencies(elf):
            dependencies = []
            dynamic_section = elf.get_section_by_name('.dynamic')
            if dynamic_section:
                for tag in dynamic_section.iter_tags():
                    if tag.entry.d_tag == 'DT_NEEDED':
                        dependencies.append(tag.needed)
            return dependencies

        try:
            result = self._with_elf_file(get_dependencies)
            return result if result is not None else []
        except Exception as e:
            self.log.error(f"Error getting dependencies: {e}")
            return []