Carola Gatto

30 papers Journal 7Unranked 23
YearRankTypeTitle / Venue / Authors
2025 J jnl
Digit. Appl. Archaeol. Cult. Heritage
Carola Gatto, Maria Cristina Barba, Sofia Chiarello, Laura Corchia, Federica Faggiano, Benito Luigi Nuzzo, Giada Sumerano, Valerio De Luca, Lucio Tommaso De Paolis
2025 conf
XR (5)
Ileana Riera Panaro, Giorgia De Giuseppe, Laura Corchia, Federica Faggiano, Carola Gatto, Lucio Tommaso De Paolis
2025 conf
XR (5)
Laura Corchia, Giorgia De Giuseppe, Federica Faggiano, Carola Gatto, Giovanna Ilenia Paladini, Ileana Riera Panaro, Lucio Tommaso De Paolis
2025 J jnl
ACM Journal on Computing and Cultural Heritage
Carola Gatto, Maria Cristina Barba, Sofia Chiarello, Laura Corchia, Federica Faggiano, Benito Luigi Nuzzo, Ileana Riera Panaro, Giada Sumerano, Valerio De Luca, Manuela De Giorgi, Lucio Tommaso De Paolis
2025 conf
XR (5)
Federica Faggiano, Marco Calò, Laura Corchia, Giovanni D'Errico, Carola Gatto, Giovanna Ilenia Paladini, Lucio Tommaso De Paolis
2024 conf
XR (3)
Carola Gatto, Sofia Chiarello, Laura Corchia, Federica Faggiano, Lucio Tommaso De Paolis
2024 conf
XR (3)
Francesco Morciano, Marta Mondellini, Giovanni D'Errico, Carola Gatto, Giulia Pellegrino, Alessandro Antonietti, Fulvia Palesi, Lucio Tommaso De Paolis
2024 conf
XR (3)
Carola Gatto, Sofia Chiarello, Federica Faggiano, Giovanna Ilenia Paladini, Giada Sumerano, Lucio Tommaso De Paolis
2024 conf
XR (2)
Federica Faggiano, Maria Cristina Barba, Laura Corchia, Carola Gatto, Giovanna Ilenia Paladini, Lucio Tommaso De Paolis
2023 conf
XR (1)
Giovanni D'Errico, Pasquale Arpaia, Lucio Tommaso De Paolis, Antonio Esposito, Carola Gatto, Sabrina Grassini, Giovanna Mastrati, Nicola Moccaldi, Angela Natalizio, Benito Luigi Nuzzo
2023 conf
XR (2)
Carola Gatto, Sofia Chiarello, Federica Faggiano, Benito Luigi Nuzzo, Ileana Riera Panaro, Giada Sumerano, Lucio Tommaso De Paolis
2023 conf
XR (2)
Nicola Capece, Carola Gatto, Gilda Manfredi, Gabriele Gilio, Benito Luigi Nuzzo, Lucio Tommaso De Paolis, Ugo Erra
2023 conf
XR (1)
Giovanni D'Errico, Maria Cristina Barba, Carola Gatto, Benito Luigi Nuzzo, Fabiana Nuccetelli, Valerio De Luca, Lucio Tommaso De Paolis
2023 J jnl
Virtual Real.
Lucio Tommaso De Paolis, Carola Gatto, Laura Corchia, Valerio De Luca
2023 J jnl
Inf.
Valerio De Luca, Carola Gatto, Silvia Liaci, Laura Corchia, Sofia Chiarello, Federica Faggiano, Giada Sumerano, Lucio Tommaso De Paolis
2022 conf
XR (1)
Carola Gatto, Giovanni D'Errico, Fabiana Nuccetelli, Benito Luigi Nuzzo, Maria Cristina Barba, Giovanna Ilenia Paladini, Lucio Tommaso De Paolis
2022 conf
XR (1)
Carola Gatto, Kim Martinez, Lucio Tommaso De Paolis
2022 conf
XR (1)
Carola Gatto, Silvia Liaci, Laura Corchia, Sofia Chiarello, Federica Faggiano, Giada Sumerano, Lucio Tommaso De Paolis
2022 J jnl
Digit. Appl. Archaeol. Cult. Heritage
Lucio Tommaso De Paolis, Federica Faggiano, Carola Gatto, Maria Cristina Barba, Valerio De Luca
2022 J jnl
Digit. Appl. Archaeol. Cult. Heritage
Lucio Tommaso De Paolis, Sofia Chiarello, Carola Gatto, Silvia Liaci, Valerio De Luca
2022 conf
MetroXRAINE
Carola Gatto, Lucia Calabrese, Salvatore G. Chiarella, Valerio De Luca, Giovanni D'Errico, Benito Luigi Nuzzo, Antonino Raffone, Lucio Tommaso De Paolis
2021 J jnl
ACM Journal on Computing and Cultural Heritage
Doriana Cisternino, Laura Corchia, Valerio De Luca, Carola Gatto, Silvia Liaci, Liliana Scrivano, Anna Trono, Lucio Tommaso De Paolis
2021 conf
AVR
Lucio Tommaso De Paolis, Pasquale Arpaia, Giovanni D'Errico, Carola Gatto, Nicola Moccaldi, Fabiana Nuccetelli
2021 conf
AVR
Lucio Tommaso De Paolis, Sofia Chiarello, Giovanni D'Errico, Carola Gatto, Benito Luigi Nuzzo, Giada Sumerano
2021 conf
AVR
Carola Gatto, Giovanni D'Errico, Giovanna Ilenia Paladini, Lucio Tommaso De Paolis
2020 conf
AVR (2)
David Checa, Carola Gatto, Doriana Cisternino, Lucio Tommaso De Paolis, Andrés Bustillo
2020 conf
AVR (1)
Lucio Tommaso De Paolis, Valerio De Luca, Carola Gatto, Giovanni D'Errico, Giovanna Ilenia Paladini
2020 conf
AVR (2)
Carola Gatto, Giovanni D'Errico, Fabiana Nuccetelli, Valerio De Luca, Giovanna Ilenia Paladini, Lucio Tommaso De Paolis
2019 conf
AVR (2)
Doriana Cisternino, Carola Gatto, Giovanni D'Errico, Valerio De Luca, Maria Cristina Barba, Giovanna Ilenia Paladini, Lucio Tommaso De Paolis
2018 conf
AVR (2)
Doriana Cisternino, Carola Gatto, Lucio Tommaso De Paolis
redb/extractors/elf_extractors/elf_symbols.py
← Index redb/extractors/elf_extractors/elf_symbols.py python
import inspect
from datetime import datetime, timezone
from typing import Any, List, Dict

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

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFSymbol


class ELFSymbolExtractor(ELFExtractor):

    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,
            elf,
        )
        self.elf_symbols = []
        self.elastic_index = self.index_prefix + "-elf_symbols"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _map_symbol_type(self, st_type_str: str) -> int:
        """Map symbol type string to enum value."""
        type_map = {
            'STT_NOTYPE': 0,
            'STT_OBJECT': 1,
            'STT_FUNC': 2,
            'STT_SECTION': 3,
            'STT_FILE': 4,
            'STT_COMMON': 5,
            'STT_TLS': 6
        }
        return type_map.get(st_type_str, 0)

    def _map_symbol_bind(self, st_bind_str: str) -> int:
        """Map symbol binding string to enum value."""
        bind_map = {
            'STB_LOCAL': 0,
            'STB_GLOBAL': 1,
            'STB_WEAK': 2
        }
        return bind_map.get(st_bind_str, 0)

    def _map_symbol_visibility(self, st_vis_str: str) -> int:
        """Map symbol visibility string to enum value."""
        vis_map = {
            'STV_DEFAULT': 0,
            'STV_INTERNAL': 1,
            'STV_HIDDEN': 2,
            'STV_PROTECTED': 3
        }
        return vis_map.get(st_vis_str, 0)

    def _extract_symbol_data(self, symbol, is_dynamic: bool = False) -> Dict:
        """Extract data from a single symbol."""
        try:
            # Get symbol name (handle empty names)
            symbol_name = symbol.name if symbol.name else f"<unnamed_{symbol.entry.get('st_name', 0)}>"

            # Get symbol properties
            symbol_value = symbol.entry.get('st_value', 0)
            symbol_size = symbol.entry.get('st_size', 0)

            # Handle section index - can be integer or special string like 'SHN_UNDEF'
            st_shndx_raw = symbol.entry.get('st_shndx', 0)
            if isinstance(st_shndx_raw, str):
                # Map special section index strings to integers
                shndx_map = {
                    'SHN_UNDEF': 0,
                    'SHN_ABS': 65521,  # 0xFFF1
                    'SHN_COMMON': 65522,  # 0xFFF2
                    'SHN_XINDEX': 65535,  # 0xFFFF
                }
                symbol_section_index = shndx_map.get(st_shndx_raw, 0)
                symbol_section_index_str = st_shndx_raw.replace('SHN_', '') if st_shndx_raw.startswith('SHN_') else st_shndx_raw
            else:
                symbol_section_index = st_shndx_raw
                symbol_section_index_str = str(st_shndx_raw)

            # Get symbol type and map to enum
            st_type_str = symbol.entry.get('st_info', {}).get('type', 'STT_NOTYPE')
            symbol_type_enum = self._map_symbol_type(st_type_str)
            symbol_type_str = st_type_str.replace('STT_', '') if st_type_str.startswith('STT_') else st_type_str

            # Get symbol binding and map to enum
            st_bind_str = symbol.entry.get('st_info', {}).get('bind', 'STB_LOCAL')
            symbol_bind_enum = self._map_symbol_bind(st_bind_str)
            symbol_bind_str = st_bind_str.replace('STB_', '') if st_bind_str.startswith('STB_') else st_bind_str

            # Get symbol visibility and map to enum
            st_vis_str = symbol.entry.get('st_other', {}).get('visibility', 'STV_DEFAULT')
            symbol_visibility_enum = self._map_symbol_visibility(st_vis_str)
            symbol_visibility_str = st_vis_str.replace('STV_', '') if st_vis_str.startswith('STV_') else st_vis_str

            return ELFSymbol(
                symbol_name=symbol_name,
                symbol_value=symbol_value,
                symbol_size=symbol_size,
                symbol_type=symbol_type_enum,
                symbol_type_str=symbol_type_str,
                symbol_bind=symbol_bind_enum,
                symbol_bind_str=symbol_bind_str,
                symbol_visibility=symbol_visibility_enum,
                symbol_visibility_str=symbol_visibility_str,
                symbol_section_index=symbol_section_index,
                symbol_section_index_str=symbol_section_index_str,
                is_dynamic=1 if is_dynamic else 0
            )

        except Exception as e:
            self.log.error(f"Error extracting symbol data: {e}")
            return None

    def _extract_symbols_from_section(self, elf, section_name: str, is_dynamic: bool = False) -> List[Dict]:
        """Extract symbols from a specific symbol table section."""
        symbols = []

        try:
            section = elf.get_section_by_name(section_name)
            if not section:
                self.log.debug(f"No {section_name} section found")
                return symbols

            if not hasattr(section, 'iter_symbols'):
                self.log.debug(f"Section {section_name} is not a symbol table")
                return symbols

            # Iterate through symbols in the section with per-symbol error handling
            for symbol_index, symbol in enumerate(section.iter_symbols()):
                try:
                    symbol_data = self._extract_symbol_data(symbol, is_dynamic)
                    if symbol_data:
                        symbols.append(symbol_data)
                except Exception as e:
                    self.log.warning(f"Error processing symbol {symbol_index} in {section_name}: {e}")
                    # Continue with other symbols

        except Exception as e:
            self.log.error(f"Error extracting symbols from {section_name}: {e}")

        return symbols

    def tag(self):
        return Tag.ELF_SYMBOLS.value if hasattr(Tag, 'ELF_SYMBOLS') else "elf_symbols"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                all_symbols = []

                # Extract static symbols from .symtab with individual error handling
                try:
                    static_symbols = self._extract_symbols_from_section(elf, '.symtab', is_dynamic=False)
                    all_symbols.extend(static_symbols)
                    self.log.debug(f"Extracted {len(static_symbols)} static symbols from .symtab")
                except Exception as e:
                    self.log.warning(f"Error extracting static symbols from .symtab: {e}")

                # Extract dynamic symbols from .dynsym with individual error handling
                try:
                    dynamic_symbols = self._extract_symbols_from_section(elf, '.dynsym', is_dynamic=True)
                    all_symbols.extend(dynamic_symbols)
                    self.log.debug(f"Extracted {len(dynamic_symbols)} dynamic symbols from .dynsym")
                except Exception as e:
                    self.log.warning(f"Error extracting dynamic symbols from .dynsym: {e}")

                return all_symbols

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_symbols = result
            return self.elf_symbols

        except Exception as e:
            self.log.error(f"Error extracting ELF symbols {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_symbols
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no symbols (e.g., stripped binary)
                # None is reserved for actual errors

                # Prepare data arrays for all symbols
                data = []
                current_time = datetime.now(timezone.utc)
                for symbol in self.elf_symbols:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        symbol.symbol_name,
                        symbol.symbol_value,
                        symbol.symbol_size,
                        symbol.symbol_type,
                        symbol.symbol_type_str,
                        symbol.symbol_bind,
                        symbol.symbol_bind_str,
                        symbol.symbol_visibility,
                        symbol.symbol_visibility_str,
                        symbol.symbol_section_index,
                        symbol.symbol_section_index_str,
                        symbol.is_dynamic,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'symbol_name', 'symbol_value', 'symbol_size',
                    'symbol_type', 'symbol_type_str',
                    'symbol_bind', 'symbol_bind_str',
                    'symbol_visibility', 'symbol_visibility_str',
                    'symbol_section_index', 'symbol_section_index_str', 'is_dynamic',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt64', 'UInt64',
                    "Enum8('NOTYPE'=0, 'OBJECT'=1, 'FUNC'=2, 'SECTION'=3, 'FILE'=4, 'COMMON'=5, 'TLS'=6)",
                    'LowCardinality(String)',
                    "Enum8('LOCAL'=0, 'GLOBAL'=1, 'WEAK'=2)",
                    'LowCardinality(String)',
                    "Enum8('DEFAULT'=0, 'INTERNAL'=1, 'HIDDEN'=2, 'PROTECTED'=3)",
                    'LowCardinality(String)',
                    'UInt16', 'LowCardinality(String)', 'UInt8',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

    def get_clickhouse_table(self) -> str:
        return "redb_elf_symbols"