Isabelle Queinnec

41 papers A 1C 6Journal 20Unranked 14
YearRankTypeTitle / Venue / Authors
2024 J jnl
Eur. J. Control
Nicola Zaupa, Giulia Giordano, Isabelle Queinnec, Sophie Tarbouriech, Luca Zaccarian
2024 conf
MED
Thalita E. Nazaré, Isabelle Queinnec, Erivelton G. Nepomuceno
2024 J jnl
Syst. Control. Lett.
Carla de Souza, Sophie Tarbouriech, Isabelle Queinnec, Antoine Girard
2023 conf
CDC
Nicola Zaupa, Luca Zaccarian, Sophie Tarbouriech, Isabelle Queinnec, Giulia Giordano
2023 J jnl
CoRR
Nicola Zaupa, Luca Zaccarian, Isabelle Queinnec, Sophie Tarbouriech, Giulia Giordano
2023 J jnl
CoRR
Giulia Giordano, Isabelle Queinnec, Sophie Tarbouriech, Luca Zaccarian, Nicola Zaupa
2023 J jnl
IEEE Control. Syst. Lett.
Nicola Zaupa, Carlos Olalla, Isabelle Queinnec, Luis Martínez-Salamero, Luca Zaccarian
2022 conf
HANDY
Sophie Tarbouriech, Christophe Prieur, Isabelle Queinnec, Luca Zaccarian, Germain Garcia
2022 J jnl
IEEE Trans. Autom. Control.
Isabelle Queinnec, Sophie Tarbouriech, Giorgio Valmorbida, Luca Zaccarian
2019 J jnl
IEEE Trans. Control. Netw. Syst.
Laura Dal Col, Isabelle Queinnec, Sophie Tarbouriech, Luca Zaccarian
2019 conf
CDC
Sophie Tarbouriech, Isabelle Queinnec, Christophe Prieur
2018 J jnl
Found. Trends Syst. Control.
Christophe Prieur, Isabelle Queinnec, Sophie Tarbouriech, Luca Zaccarian
2018 J jnl
IFAC J. Syst. Control.
Sophie Tarbouriech, Isabelle Queinnec, Christophe Prieur
2017 J jnl
IEEE Trans. Autom. Control.
Giorgio Valmorbida, Luca Zaccarian, Sophie Tarbouriech, Isabelle Queinnec, Antonis Papachristodoulou
2016 conf
ECC
Said Zabi, Isabelle Queinnec, Sophie Tarbouriech, Michel Mazerolles
2016 J jnl
IEEE Trans. Autom. Control.
João Manoel Gomes da Silva, Isabelle Queinnec, Alexandre Seuret, Sophie Tarbouriech
2015 conf
CDC
Isabelle Queinnec, Sophie Tarbouriech, Sandira Gayadeen, Luca Zaccarian
2014 conf
CDC
Giorgio Valmorbida, Luca Zaccarian, Sophie Tarbouriech, Isabelle Queinnec, Antonis Papachristodoulou
2014 J jnl
IEEE Trans. Control. Syst. Technol.
Luiz R. Douat, Isabelle Queinnec, Germain Garcia, Micaël Michelin, François Pierrot, Sophie Tarbouriech
2014 J jnl
IEEE Trans. Autom. Control.
Sophie Tarbouriech, Isabelle Queinnec, Christophe Prieur
2013 conf
CDC
Sophie Tarbouriech, Isabelle Queinnec, Christophe Prieur
2012 J jnl
IEEE Trans. Ind. Electron.
Carlos Olalla, Isabelle Queinnec, Ramon Leyva, Abdelali El Aroudi
2012 conf
ROCOND
Luiz Ricardo Douat, Isabelle Queinnec, Germain Garcia, Micaël Michelin, François Pierrot
2011 C conf
CCA
Luiz R. Douat, Isabelle Queinnec, Germain Garcia, Micaël Michelin, François Pierrot
2011 C conf
CCA
Carlos Olalla, Isabelle Queinnec, Ramon Leyva
2011 J jnl
Autom.
Sophie Tarbouriech, Isabelle Queinnec, Teodoro Alamo, Mirko Fiacchini, Eduardo F. Camacho
2010 A conf
IROS
Luiz R. Douat, Isabelle Queinnec, Germain Garcia, Micaël Michelin, François Pierrot
2010 C conf
ACC
Sophie Tarbouriech, Christophe Prieur, Isabelle Queinnec, Talía Simões dos Santos
2010 C conf
ACC
Ixbalank Torres, Isabelle Queinnec, Carlos Vilas, Alain Vande Wouwer
2010 J jnl
Autom.
Sophie Tarbouriech, Christophe Prieur, Isabelle Queinnec
2009 conf
ECC
Sophie Tarbouriech, Isabelle Queinnec, Matthew C. Turner
2009 J jnl
IEEE Trans. Ind. Electron.
Carlos Olalla, Ramon Leyva, Abdelali El Aroudi, Isabelle Queinnec
2009 J jnl
PLoS Comput. Biol.
Clémentine Dressaire, Christophe Gitton, Pascal Loubière, Véronique Monnet, Isabelle Queinnec, Muriel Cocaign-Bousquet
2008 J jnl
Autom.
Eugênio B. Castelan, Sophie Tarbouriech, Isabelle Queinnec
2007 C conf
ACC
Vinicius Foletto Montagner, Ricardo C. L. F. Oliveira, Pedro L. D. Peres, Sophie Tarbouriech, Isabelle Queinnec
2006 conf
CDC
Vinicius Foletto Montagner, Pedro L. D. Peres, Sophie Tarbouriech, Isabelle Queinnec
2006 J jnl
Int. J. Syst. Sci.
Sophie Tarbouriech, Isabelle Queinnec, Germain Garcia
2004 C conf
ACC
Ramon Leyva, Isabelle Queinnec, Sophie Tarbouriech, Corinne Alonso, Luis Martínez-Salamero
2003 conf
ECC
Isabelle Queinnec, Mathieu Spérandio
2000 conf
CDC
Sophie Tarbouriech, Pedro L. D. Peres, Germain Garcia, Isabelle Queinnec
1999 conf
ECC
Isabelle Queinnec, D. Léonard, Chérif Ben Youssef
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"