Vassil S. Dimitrov

110 papers A* 1A 5B 1C 16Misc 2Journal 66Unranked 18
YearRankTypeTitle / Venue / Authors
2024 C conf
ARITH
Vassil S. Dimitrov, Richard Ford, Laurent Imbert, Arjuna Madanayake, Nilan Udayanga, Will Wray
2023 J jnl
J. Cryptogr. Eng.
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2022 J jnl
CoRR
Arjuna Madanayake, Renato J. Cintra, Vassil S. Dimitrov, Leonard T. Bruton
2022 J jnl
IACR Cryptol. ePrint Arch.
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2022 J jnl
IEEE Trans. Computers
Vassil S. Dimitrov, Luigi Vigneri, Vidal Attias
2022 J jnl
CoRR
Diego F. G. Coelho, Renato J. Cintra, Fábio M. Bayer, Sunera Kulasekera, Arjuna Madanayake, P. A. C. Martinez, Thiago L. T. da Silveira, Raíza S. Oliveira, Vassil S. Dimitrov
2022 ed.
CoNGA
John Gustafson, Vassil S. Dimitrov
2022 J jnl
IACR Cryptol. ePrint Arch.
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2021 J jnl
IACR Cryptol. ePrint Arch.
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2020 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Vítor de A. Coutinho, Viduneth Ariyarathna, Diego F. G. Coelho, Sravan Kumar Pulipati, Renato J. Cintra, Arjuna Madanayake, Fábio M. Bayer, Vassil S. Dimitrov
2020 conf
Tokenomics
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2020 J jnl
IACR Cryptol. ePrint Arch.
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2020 J jnl
CoRR
A. Borges Jr., Renato J. Cintra, Diego F. G. Coelho, Vassil S. Dimitrov
2020 B conf
GLOBECOM
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2020 J jnl
CoRR
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2019 conf
IEEE ICBC
Luigi Vigneri, Wolfgang Welz, Alon Gal, Vassil S. Dimitrov
2019 J jnl
CoRR
Vidal Attias, Luigi Vigneri, Vassil S. Dimitrov
2019 J jnl
CoRR
Vassil S. Dimitrov, Luigi Vigneri, Vidal Attias
2018 J jnl
CoRR
Jithra Adikari, Vassil S. Dimitrov, Renato J. Cintra
2018 J jnl
IEEE Trans. Computers
Diego F. G. Coelho, Sushmabhargavi Nimmalapalli, Vassil S. Dimitrov, Arjuna Madanayake, Renato J. Cintra, Arnaud Tisserand
2018 J jnl
CoRR
Diego F. G. Coelho, Renato J. Cintra, Vassil S. Dimitrov
2018 J jnl
J. Signal Process. Syst.
Diego F. G. Coelho, Renato J. Cintra, Vassil S. Dimitrov
2018 J jnl
J. Comput. Appl. Math.
Diego F. G. Coelho, Vassil S. Dimitrov, Logan Rakai
2018 J jnl
CoRR
Diego F. G. Coelho, Renato J. Cintra, Alejandro C. Frery, Vassil S. Dimitrov
2018 J jnl
Comput. Geosci.
Diego F. G. Coelho, Renato J. Cintra, Alejandro César Frery, Vassil S. Dimitrov
2017 C conf
ARITH
Vassil S. Dimitrov, Viduneth Ariyarathna, Diego F. G. Coelho, Logan Rakai, Arjuna Madanayake, Renato J. Cintra
2017 J jnl
CoRR
Amila Edirisuriya, Arjuna Madanayake, Renato J. Cintra, Vassil S. Dimitrov
2017 J jnl
IEEE Trans. Computers
Diego F. G. Coelho, Renato J. Cintra, Nilanka T. Rajapaksha, Gihan J. Mendis, Arjuna Madanayake, Vassil S. Dimitrov
2017 conf
CCECE
Diego F. G. Coelho, Vassil S. Dimitrov
2017 J jnl
CoRR
Vassil S. Dimitrov, Diego F. G. Coelho
2017 J jnl
CoRR
Nilanka T. Rajapaksha, Arjuna Madanayake, Renato J. Cintra, Jithra Adikari, Vassil S. Dimitrov
2016 A* conf
CCS
Vassil S. Dimitrov, Liisi Kerik, Toomas Krips, Jaak Randmets, Jan Willemson
2016 J jnl
IACR Cryptol. ePrint Arch.
Vassil S. Dimitrov, Liisi Kerik, Toomas Krips, Jaak Randmets, Jan Willemson
2016 conf
EUSIPCO
Diego F. G. Coelho, Rangaraj M. Rangayyan, Vassil S. Dimitrov
2016 J jnl
IET Signal Process.
Diego F. G. Coelho, Renato J. Cintra, Sunera Kulasekera, Arjuna Madanayake, Vassil S. Dimitrov
2015 J jnl
IEEE Trans. Computers
Kimmo Järvinen, Vassil S. Dimitrov, Reza Azarderakhsh
2015 J jnl
CoRR
Arjuna Madanayake, Renato J. Cintra, Denis Onen, Vassil S. Dimitrov, Nilanka T. Rajapaksha, Leonard T. Bruton, Amila Edirisuriya
2015 J jnl
CoRR
Renato J. Cintra, Vassil S. Dimitrov, Hélio M. de Oliveira, Ricardo M. Campello de Souza
2015 A conf
CHES
Sujoy Sinha Roy, Kimmo Järvinen, Frederik Vercauteren, Vassil S. Dimitrov, Ingrid Verbauwhede
2015 J jnl
IACR Cryptol. ePrint Arch.
Sujoy Sinha Roy, Kimmo Järvinen, Frederik Vercauteren, Vassil S. Dimitrov, Ingrid Verbauwhede
2015 J jnl
CoRR
Renato J. Cintra, Vassil S. Dimitrov
2015 J jnl
IEEE Trans. Computers
Nilanka T. Rajapaksha, Arjuna Madanayake, Renato J. Cintra, Jithra Adikari, Vassil S. Dimitrov
2014 J jnl
Multidimens. Syst. Signal Process.
Shiva Kumar Madishetty, Arjuna Madanayake, Renato J. Cintra, Vassil S. Dimitrov, Dale H. Mugler
2014 J jnl
IEEE Trans. Computers
Reza Azarderakhsh, Kimmo Järvinen, Vassil S. Dimitrov
2014 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Shiva Kumar Madishetty, Arjuna Madanayake, Renato J. Cintra, Vassil S. Dimitrov
2013 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Amila Edirisuriya, Arjuna Madanayake, Renato J. Cintra, Vassil S. Dimitrov, Nilanka T. Rajapaksha
2013 C conf
IEEE Symposium on Computer Arithmetic
Vassil S. Dimitrov, Kimmo Järvinen
2013 J jnl
J. Electr. Comput. Eng.
Nilanka T. Rajapaksha, Amila Edirisuriya, Arjuna Madanayake, Renato J. Cintra, Denis Onen, Ihab Amer, Vassil S. Dimitrov
2013 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Shiva Kumar Madishetty, Arjuna Madanayake, Renato J. Cintra, Vassil S. Dimitrov, Dale H. Mugler
2012 J jnl
IEEE Trans. Computers
Jithra Adikari, Vassil S. Dimitrov, Kimmo U. Järvinen
2012 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Arjuna Madanayake, Renato J. Cintra, Denis Onen, Vassil S. Dimitrov, Nilanka T. Rajapaksha, Leonard T. Bruton, Amila Edirisuriya
2012 J jnl
Parallel Process. Lett.
Arjuna Madanayake, Renato J. Cintra, Vassil S. Dimitrov, Leonard T. Bruton
2012 C conf
ISCAS
Shiva Madishetty, Arjuna Madanayake, Renato J. Cintra, Dale H. Mugler, Vassil S. Dimitrov
2012 C conf
CIS
Jarno M. A. Tanskanen, Xiao Zhi Gao, Jing Wang, Ping Guo, Jari A. K. Hyttinen, Vassil S. Dimitrov
2011 C conf
ISCAS
Jithra Adikari, Vassil S. Dimitrov, Renato J. Cintra
2011 C conf
ISCAS
Arjuna Madanayake, Renato J. Cintra, Denis Onen, Vassil S. Dimitrov, Leonard T. Bruton
2011 J jnl
IEEE Trans. Computers
Vassil S. Dimitrov, Kimmo U. Järvinen, Jithra Adikari
2011 J jnl
IEEE Trans. Computers
Jithra Adikari, Vassil S. Dimitrov, Laurent Imbert
2010 J jnl
IEEE Trans. Signal Process.
Renato J. Cintra, Vassil S. Dimitrov
2009 J jnl
Signal Process. Image Commun.
Renato J. Cintra, Vassil S. Dimitrov, Hélio M. de Oliveira, Ricardo M. Campello de Souza
2009 C conf
IEEE Symposium on Computer Arithmetic
Jithra Adikari, Vassil S. Dimitrov, Laurent Imbert
2008 J jnl
Adv. Math. Commun.
Pradeep Kumar Mishra, Vassil S. Dimitrov
2008 J jnl
IACR Cryptol. ePrint Arch.
Jithra Adikari, Vassil S. Dimitrov, Pradeep Kumar Mishra
2008 J jnl
IACR Cryptol. ePrint Arch.
Jithra Adikari, Vassil S. Dimitrov, Laurent Imbert
2008 A conf
ICME
Ihab Amer, Wael M. Badawy, Vassil S. Dimitrov, Graham A. Jullien
2008 J jnl
IEEE Trans. Computers
Vassil S. Dimitrov, Kimmo U. Järvinen, Michael J. Jacobson Jr., W. F. Chan, Zhun Huang
2008 J jnl
Math. Comput.
Vassil S. Dimitrov, Laurent Imbert, Pradeep Kumar Mishra
2007 Misc conf
INDOCRYPT
Pradeep Kumar Mishra, Vassil S. Dimitrov
2007 C conf
ISC
Pradeep Kumar Mishra, Vassil S. Dimitrov
2007 J jnl
IACR Cryptol. ePrint Arch.
Pradeep Kumar Mishra, Vassil S. Dimitrov
2007 C conf
IEEE Symposium on Computer Arithmetic
Vassil S. Dimitrov, Laurent Imbert, Andrew Zakaluzny
2007 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Khan A. Wahid, Vassil S. Dimitrov, Graham A. Jullien
2006 A conf
ASIACRYPT
Roberto Maria Avanzi, Vassil S. Dimitrov, Christophe Doche, Francesco Sica
2006 A conf
CHES
Vassil S. Dimitrov, Kimmo U. Järvinen, Michael J. Jacobson Jr., W. F. Chan, Zhun Huang
2006 conf
APCCAS
Khan Wahid, Vassil S. Dimitrov, Graham A. Jullien
2006 J jnl
IACR Cryptol. ePrint Arch.
Vassil S. Dimitrov, Kimmo U. Järvinen, Michael J. Jacobson Jr., W. F. Chan, Zhun Huang
2005 conf
ASAP
Ian Steiner, P. Chan, Laurent Imbert, Graham A. Jullien, Vassil S. Dimitrov, G. H. McGibney
2005 J jnl
EURASIP J. Adv. Signal Process.
Roberto Muscedere, Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
2005 J jnl
J. VLSI Signal Process.
Mehboob Alam, Wael M. Badawy, Vassil S. Dimitrov, Graham A. Jullien
2005 conf
ISCAS (4)
Y. Ibrahim, William C. Miller, Graham A. Jullien, Vassil S. Dimitrov
2005 J jnl
IEEE Trans. Computers
Roberto Muscedere, Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
2005 A conf
ASIACRYPT
Vassil S. Dimitrov, Laurent Imbert, Pradeep Kumar Mishra
2005 C conf
IEEE Symposium on Computer Arithmetic
Khan Wahid, Vassil S. Dimitrov, Graham A. Jullien
2005 J jnl
IACR Cryptol. ePrint Arch.
Vassil S. Dimitrov, Laurent Imbert, P. K. Mishra
2004 conf
IWSOC
Wenjing Zhang, Graham A. Jullien, Vassil S. Dimitrov
2004 conf
ISCAS (2)
Minyi Fu, Graham A. Jullien, Vassil S. Dimitrov, Majid Ahmadi
2004 conf
ISCAS (2)
Wenjing Zhang, Graham A. Jullien, Vassil S. Dimitrov
2004 J jnl
J. Circuits Syst. Comput.
Khan Wahid, Vassil S. Dimitrov, Graham A. Jullien
2003 conf
ESTIMedia
Wenjing Zhang, Jonathan Eskritt, Graham A. Jullien, Vassil S. Dimitrov
2003 C conf
IEEE Symposium on Computer Arithmetic
Khan A. Wahid, Vassil S. Dimitrov, Graham A. Jullien
2003 J jnl
Digit. Signal Process.
Jarno M. A. Tanskanen, Vassil S. Dimitrov
2003 conf
IWSOC
Minyi Fu, Graham A. Jullien, Vassil S. Dimitrov, Majid Ahmadi, William C. Miller
2002 conf
DCV
Khan A. Wahid, Vassil S. Dimitrov, Graham A. Jullien, Wael M. Badawy
2002 conf
ASAP
Roberto Muscedere, Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
2001 conf
ISCAS (4)
Minyi Fu, Vassil S. Dimitrov, Graham A. Jullien
2001 C conf
IEEE Symposium on Computer Arithmetic
Vassil S. Dimitrov, Jonathan Eskritt, Laurent Imbert, Graham A. Jullien, William C. Miller
2000 J jnl
IEEE Trans. Computers
Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
2000 conf
EUSIPCO
Ramin Baghaie, Vassil S. Dimitrov
1999 conf
ISCAS (1)
Graham A. Jullien, Vassil S. Dimitrov, B. Li, William C. Miller, A. Lee, Majid Ahmadi
1999 J jnl
IEEE Trans. Computers
Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
1998 Misc conf
ICASSP
Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
1998 J jnl
IEEE Trans. Signal Process.
Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
1998 J jnl
Inf. Process. Lett.
Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
1998 conf
Great Lakes Symposium on VLSI
Saeid Sadeghi-Emamchaie, Graham A. Jullien, Vassil S. Dimitrov, William C. Miller
1998 J jnl
J. Circuits Syst. Comput.
Saeid Sadeghi-Emamchaie, Graham A. Jullien, Vassil S. Dimitrov, William C. Miller
1997 C conf
IEEE Symposium on Computer Arithmetic
Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
1997 C conf
IEEE Symposium on Computer Arithmetic
Vassil S. Dimitrov, Graham A. Jullien, William C. Miller
1995 J jnl
IEEE Trans. Signal Process.
Vassil S. Dimitrov, T. V. Cosklev, B. Bonevsky
1994 C conf
ISCAS
Vassil S. Dimitrov, Todor Cooklev
1992 J jnl
Inf. Process. Lett.
Vassil S. Dimitrov, Todor Cooklev, B. D. Donevsky
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 []