Valentin E. Brimkov

111 papers B 1C 26Misc 3Journal 53Unranked 20
YearRankTypeTitle / Venue / Authors
2026 C ed.
IWCIA
Péter Balázs, Reneta P. Barneva, Valentin E. Brimkov, Antal Nagy
2024 Misc ed.
ISAIM
Reneta P. Barneva, Valentin E. Brimkov, Claudio Gentile, Aldo Pacchiano
2024 J jnl
Ann. Math. Artif. Intell.
Valentin E. Brimkov
2024 J jnl
Discret. Appl. Math.
Boris Brimkov, Valentin E. Brimkov
2023 C ed.
IWCIA
Reneta P. Barneva, Valentin E. Brimkov, Giorgio Nordo
2022 J jnl
J. Comb. Optim.
Boris Brimkov, Valentin E. Brimkov
2020 C ed.
IWCIA
Tibor Lukic, Reneta P. Barneva, Valentin E. Brimkov, Lidija Comic, Natasa Sladoje
2020 C conf
IWCIA
Valentin E. Brimkov, Reneta P. Barneva, Kamen Kanev
2020 C conf
IWCIA
Boris Brimkov, Valentin E. Brimkov
2019 ed.
CompIMAGE
Reneta P. Barneva, Valentin E. Brimkov, Piotr Kulczycki, João Manuel R. S. Tavares
2019 J jnl
Inf. Sci.
Valentin E. Brimkov, Reneta P. Barneva
2019 conf
LTEC
Reneta P. Barneva, Valentin E. Brimkov
2018 C ed.
IWCIA
Reneta P. Barneva, Valentin E. Brimkov, João Manuel R. S. Tavares
2018 J jnl
J. Comput. Syst. Sci.
Valentin E. Brimkov, Reneta P. Barneva
2018 J jnl
Discret. Appl. Math.
Valentin E. Brimkov, Konstanty Junosza-Szaniawski, Sean Kafer, Jan Kratochvíl, Martin Pergel, Pawel Rzazewski, Matthew Szczepankiewicz, Joshua Terhaar
2018 J jnl
CoRR
Boris Brimkov, Valentin E. Brimkov
2017 C ed.
IWCIA
Valentin E. Brimkov, Reneta P. Barneva
2017 ed.
CompIMAGE
Reneta P. Barneva, Valentin E. Brimkov, João Manuel R. S. Tavares
2017 J jnl
Discret. Appl. Math.
Valentin E. Brimkov, Reneta P. Barneva
2017 J jnl
Discret. Appl. Math.
Ranita Biswas, Partha Bhowmick, Valentin E. Brimkov
2016 J jnl
Trans. Mass Data Anal. Images Signals
Valentin E. Brimkov
2016 ed.
IWCIA (Special Track on Applications)
Reneta P. Barneva, Bhargab B. Bhattacharya, Valentin E. Brimkov, Partha Bhowmick, Arindam Biswas
2015 C ed.
IWCIA
Reneta P. Barneva, Bhargab B. Bhattacharya, Valentin E. Brimkov
2015 J jnl
Ann. Math. Artif. Intell.
Reneta P. Barneva, Valentin E. Brimkov
2015 C conf
IWCIA
Ranita Biswas, Partha Bhowmick, Valentin E. Brimkov
2014 C ed.
IWCIA
Reneta P. Barneva, Valentin E. Brimkov, Josef Slapal
2014 Misc conf
PACBB
Boris Brimkov, Valentin E. Brimkov
2014 J jnl
CoRR
Valentin E. Brimkov, Konstanty Junosza-Szaniawski, Sean Kafer, Jan Kratochvíl, Martin Pergel, Pawel Rzazewski, Matthew Szczepankiewicz, Joshua Terhaar
2014 conf
CompIMAGE
Valentin E. Brimkov
2014 C conf
IWCIA
Valentin E. Brimkov, Sean Kafer, Matthew Szczepankiewicz, Joshua Terhaar
2014 C conf
IWCIA
Valentin E. Brimkov
2013 J jnl
Int. J. Comput. Math.
Valentin E. Brimkov
2013 conf
ISVC (1)
Valentin E. Brimkov
2013 J jnl
Int. J. Comput. Math.
Valentin E. Brimkov, Reneta P. Barneva
2012 J jnl
Discret. Appl. Math.
Valentin E. Brimkov, Andrew Leach, Jimmy Wu, Michael Mastroianni
2012 C ed.
IWCIA
Reneta P. Barneva, Valentin E. Brimkov, Jake K. Aggarwal
2011 ed.
IWCIA Special Track on Applications
Reneta P. Barneva, Valentin E. Brimkov, Kostadin Koroutchev, Elka Korutcheva
2011 C ed.
IWCIA
Jake K. Aggarwal, Reneta P. Barneva, Valentin E. Brimkov, Kostadin Koroutchev, Elka Korutcheva
2011 C conf
IWCIA
Valentin E. Brimkov
2011 J jnl
Graph. Model.
Valentin E. Brimkov, Reneta P. Barneva
2011 J jnl
Graph. Model.
Valentin E. Brimkov, Reneta P. Barneva, Boris Brimkov
2011 J jnl
Theor. Comput. Sci.
Valentin E. Brimkov, Andrew Leach, Michael Mastroianni, Jimmy Wu
2011 J jnl
Electron. Colloquium Comput. Complex.
Valentin E. Brimkov, Andrew Leach, Jimmy Wu, Michael Mastroianni
2011 J jnl
Theor. Comput. Sci.
Valentin E. Brimkov, Reneta P. Barneva, Petra Wiederhold
2010 ed.
CompIMAGE
Reneta P. Barneva, Valentin E. Brimkov, Herbert A. Hauptman, Renato M. Natal Jorge, João Manuel R. S. Tavares
2010 ed.
CompIMAGE Special Track
Reneta P. Barneva, Valentin E. Brimkov, Renato M. Natal Jorge, João Manuel R. S. Tavares
2010 conf
CompIMAGE
Valentin E. Brimkov
2010 conf
CompIMAGE
Valentin E. Brimkov, Reneta P. Barneva
2010 conf
ISVC (1)
Valentin E. Brimkov, Andrew Leach, Michael Mastroianni, Jimmy Wu
2010 J jnl
CoRR
Valentin E. Brimkov
2009 J jnl
Pattern Recognit.
Valentin E. Brimkov, Reneta P. Barneva
2009 J jnl
Discret. Appl. Math.
Valentin E. Brimkov, Reneta P. Barneva
2009 J jnl
Int. J. Imaging Syst. Technol.
Reneta P. Barneva, Valentin E. Brimkov, Kamen Kanev
2009 J jnl
Pattern Recognit.
Valentin E. Brimkov
2009 J jnl
Discret. Appl. Math.
Valentin E. Brimkov
2009 J jnl
Int. J. Imaging Syst. Technol.
Reneta P. Barneva, Valentin E. Brimkov
2009 conf
DGCI
Valentin E. Brimkov, Reneta P. Barneva, Boris Brimkov
2009 C conf
IWCIA
Valentin E. Brimkov
2009 conf
ICSOFT (2)
Kamen Kanev, Reneta P. Barneva, Valentin E. Brimkov, Dimitrina Kaneva
2009 J jnl
Discret. Appl. Math.
Tetsuo Asano, Valentin E. Brimkov, Reneta P. Barneva
2009 C conf
IWCIA
Reneta P. Barneva, Valentin E. Brimkov, Kamen Kanev
2008 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Valentin E. Brimkov, Reinhard Klette
2008 C ed.
IWCIA
Valentin E. Brimkov, Reneta P. Barneva, Herbert A. Hauptman
2008 conf
IWCIA Special Track on Applications
Reneta P. Barneva, Valentin E. Brimkov, Kamen Kanev
2008 J jnl
Int. J. Shape Model.
Valentin E. Brimkov, Giorgio Nordo, Reneta P. Barneva, Angelo Maimone
2008 ed.
IWCIA Special Track on Applications
Reneta P. Barneva, Valentin E. Brimkov
2008 conf
ISVC (1)
Valentin E. Brimkov, Reneta P. Barneva
2008 conf
ISVC (1)
Valentin E. Brimkov, Reneta P. Barneva, Boris Brimkov, François de Vieilleville
2008 J jnl
Theor. Comput. Sci.
Valentin E. Brimkov, Reneta P. Barneva
2008 C conf
IWCIA
Valentin E. Brimkov
2007 J jnl
Discret. Appl. Math.
Valentin E. Brimkov
2007 J jnl
Image Vis. Comput.
Valentin E. Brimkov, Stefan S. Dantchev
2007 J jnl
Discret. Appl. Math.
Valentin E. Brimkov, David Coeurjolly, Reinhard Klette
2006 conf
DGCI
Valentin E. Brimkov, Davide Moroni, Reneta P. Barneva
2006 C conf
IWCIA
David Coeurjolly, Valentin E. Brimkov
2006 C conf
IWCIA
Valentin E. Brimkov, Angelo Maimone, Giorgio Nordo
2006 conf
CompIMAGE
Valentin E. Brimkov
2006 conf
CompIMAGE
Valentin E. Brimkov
2006 C conf
IWCIA
Valentin E. Brimkov, Angelo Maimone, Giorgio Nordo
2006 conf
ISVC (1)
Valentin E. Brimkov, Reneta P. Barneva
2005 J jnl
CoRR
Valentin E. Brimkov, Angelo Maimone, Giorgio Nordo
2005 J jnl
Comput. J.
Valentin E. Brimkov, Reneta P. Barneva
2005 conf
DGCI
Valentin E. Brimkov, Stefan S. Dantchev
2005 J jnl
Electron. Notes Discret. Math.
Valentin E. Brimkov, Reneta P. Barneva
2005 J jnl
Discret. Appl. Math.
Alberto Apostolico, Valentin E. Brimkov
2005 J jnl
Discret. Appl. Math.
Valentin E. Brimkov, Reneta P. Barneva
2005 Misc conf
ISVC
Valentin E. Brimkov, Angelo Maimone, Giorgio Nordo, Reneta P. Barneva, Reinhard Klette
2004 C conf
CTW
Valentin E. Brimkov
2004 J jnl
Electron. Notes Discret. Math.
Valentin E. Brimkov
2004 J jnl
Theor. Comput. Sci.
Valentin E. Brimkov, Reneta P. Barneva
2004 C conf
IWCIA
Valentin E. Brimkov, Reinhard Klette
2004 B conf
WG
Valentin E. Brimkov, Reneta P. Barneva, Reinhard Klette, Joseph Straight
2003 J jnl
Electron. Colloquium Comput. Complex.
Valentin E. Brimkov, Bruno Codenotti, Valentino Crespi, Reneta P. Barneva, Mauro Leoncini
2003 conf
DGCI
Valentin E. Brimkov, Reneta P. Barneva
2003 J jnl
Electron. Notes Discret. Math.
Valentin E. Brimkov
2002 J jnl
Appl. Math. Lett.
Valentin E. Brimkov, Stefan S. Dantchev
2002 J jnl
Theor. Comput. Sci.
Valentin E. Brimkov, Reneta P. Barneva
2002 J jnl
Pattern Recognit. Lett.
Valentin E. Brimkov, Eric Andres, Reneta P. Barneva
2001 C conf
IWCIA
Valentin E. Brimkov, Reneta P. Barneva
2001 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Valentin E. Brimkov
2000 J jnl
Theor. Comput. Sci.
Alberto Apostolico, Valentin E. Brimkov
2000 ch.
Volume Graphics (Graphics)
Valentin E. Brimkov, Reneta P. Barneva, Philippe Nehlig
2000 conf
DGCI
Valentin E. Brimkov, Eric Andres, Reneta P. Barneva
2000 J jnl
Electron. Colloquium Comput. Complex.
Valentin E. Brimkov, Stefan S. Dantchev
2000 conf
IFIP TCS
Valentin E. Brimkov, Stefan S. Dantchev
2000 C conf
CIAC
Valentin E. Brimkov, Bruno Codenotti, Valentino Crespi, Mauro Leoncini
2000 J jnl
Theor. Comput. Sci.
Reneta P. Barneva, Valentin E. Brimkov, Philippe Nehlig
1999 conf
DGCI
Valentin E. Brimkov, Reneta P. Barneva
1998 J jnl
Electron. Colloquium Comput. Complex.
Valentin E. Brimkov, Stefan S. Dantchev
1997 J jnl
J. Complex.
Valentin E. Brimkov, Stefan S. Dantchev
1996 J jnl
Theor. Comput. Sci.
Valentin E. Brimkov, Bruno Codenotti, Mauro Leoncini, Giovanni Resta
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 []