Catherine Lai

93 papers A* 1A 23B 6C 1Misc 6Journal 28Unranked 28
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Alice Ross, Nina Markl, Catherine Lai, Lauren A. Hall-Lew
2025 Misc conf
ICASSP
Adaeze Adigwe, Sarenne Wallbridge, Zehai Tu, Catherine Lai, Simon King
2025 A conf
INTERSPEECH
Alice Ross, Cliodhna Hughes, Eddie L. Ungless, Catherine Lai
2025 B conf
ICMI
Yuanchao Li, Dimitrios Kollias, Guillaume Chanel, Marios A. Fanourakis, Michal Muszynski, Brandon M. Booth, Leimin Tian, Madhawa Perera, Catherine Lai, Huili Chen
2025 A conf
INTERSPEECH
Sarenne Wallbridge, Christoph Minixhofer, Catherine Lai, Peter Bell
2025 J jnl
CoRR
Sarenne Wallbridge, Christoph Minixhofer, Catherine Lai, Peter Bell
2025 Misc conf
ICASSP
Yuanchao Li, Yuan Gong, Chao-Han Huck Yang, Peter Bell, Catherine Lai
2025 Misc conf
ICASSP
Yuanchao Li, Zixing Zhang, Jing Han, Peter Bell, Catherine Lai
2024 conf
Odyssey
Mingjie Chen, Hezhao Zhang, Yuanchao Li, Jiachen Luo, Wen Wu, Ziyang Ma, Peter Bell, Catherine Lai, Joshua D. Reiss, Lin Wang, Philip C. Woodland, Xie Chen, Huy Phan, Thomas Hain
2024 J jnl
CoRR
Mingjie Chen, Hezhao Zhang, Yuanchao Li, Jiachen Luo, Wen Wu, Ziyang Ma, Peter Bell, Catherine Lai, Joshua D. Reiss, Lin Wang, Philip C. Woodland, Xie Chen, Huy Phan, Thomas Hain
2024 conf
SLT
Yuanchao Li, Pinzhen Chen, Peter Bell, Catherine Lai
2024 J jnl
CoRR
Yuanchao Li, Pinzhen Chen, Peter Bell, Catherine Lai
2024 conf
LREC/COLING
Nina Markl, Lauren Hall-Lew, Catherine Lai
2024 conf
SLT
Chao-Han Huck Yang, Taejin Park, Yuan Gong, Yuanchao Li, Zhehuai Chen, Yen-Ting Lin, Chen Chen, Yuchen Hu, Kunal Dhawan, Piotr Zelasko, Chao Zhang, Yun-Nung Chen, Yu Tsao, Jagadeesh Balam, Boris Ginsburg, Sabato Marco Siniscalchi, Eng Siong Chng, Peter Bell, Catherine Lai, Shinji Watanabe, Andreas Stolcke
2024 J jnl
CoRR
Chao-Han Huck Yang, Taejin Park, Yuan Gong, Yuanchao Li, Zhehuai Chen, Yen-Ting Lin, Chen Chen, Yuchen Hu, Kunal Dhawan, Piotr Zelasko, Chao Zhang, Yun-Nung Chen, Yu Tsao, Jagadeesh Balam, Boris Ginsburg, Sabato Marco Siniscalchi, Eng Siong Chng, Peter Bell, Catherine Lai, Shinji Watanabe, Andreas Stolcke
2024 conf
ICASSP Workshops
Alexandra Saliba, Yuanchao Li, Ramon Sanabria, Catherine Lai
2024 J jnl
CoRR
Alexandra Saliba, Yuanchao Li, Ramon Sanabria, Catherine Lai
2024 J jnl
CoRR
Yuanchao Li, Yuan Gong, Chao-Han Huck Yang, Peter Bell, Catherine Lai
2024 J jnl
CoRR
Yuanchao Li, Zixing Zhang, Jing Han, Peter Bell, Catherine Lai
2024 conf
SLT
Yuanchao Li, Peter Bell, Catherine Lai
2024 J jnl
CoRR
Yuanchao Li, Peter Bell, Catherine Lai
2024 A conf
INTERSPEECH
Johannah O'Mahony, Catherine Lai, Éva Székely
2023 A conf
INTERSPEECH
Yuanchao Li, Zeyu Zhao, Ondrej Klejch, Peter Bell, Catherine Lai
2023 J jnl
CoRR
Yuanchao Li, Zeyu Zhao, Ondrej Klejch, Peter Bell, Catherine Lai
2023 J jnl
CoRR
Yaoting Wang, Yuanchao Li, Peter Bell, Catherine Lai
2023 A conf
EACL
Sarenne Wallbridge, Peter Bell, Catherine Lai
2023 conf
ACIIW
Yuanchao Li, Catherine Lai
2023 A conf
INTERSPEECH
Nina Markl, Catherine Lai
2023 conf
CHI Extended Abstracts
Yuanchao Li, Koji Inoue, Leimin Tian, Changzeng Fu, Carlos Toshinori Ishi, Hiroshi Ishiguro, Tatsuya Kawahara, Catherine Lai
2023 J jnl
CoRR
Yuanchao Li, Koji Inoue, Leimin Tian, Changzeng Fu, Carlos Toshinori Ishi, Hiroshi Ishiguro, Tatsuya Kawahara, Catherine Lai
2023 conf
SMM
Catherine Lai
2023 Misc conf
ICASSP
Yuanchao Li, Peter Bell, Catherine Lai
2023 A conf
INTERSPEECH
Sarenne Wallbridge, Peter Bell, Catherine Lai
2023 J jnl
CoRR
Sarenne Wallbridge, Peter Bell, Catherine Lai
2023 B conf
SIGDIAL
Shilin Gao, Matthew P. Aylett, David A. Braude, Catherine Lai
2023 conf
SSW
Johannah O'Mahony, Catherine Lai, Simon King
2023 A conf
INTERSPEECH
Yuanchao Li, Peter Bell, Catherine Lai
2023 J jnl
CoRR
Yuanchao Li, Peter Bell, Catherine Lai
2022 J jnl
CoRR
Yuanchao Li, Catherine Lai
2022 A* conf
HRI
Yuanchao Li, Catherine Lai, Divesh Lala, Koji Inoue, Tatsuya Kawahara
2022 J jnl
CoRR
Yuanchao Li, Catherine Lai, Divesh Lala, Koji Inoue, Tatsuya Kawahara
2022 A conf
INTERSPEECH
Johannah O'Mahony, Catherine Lai, Simon King
2022 J jnl
CoRR
Yuanchao Li, Yumnah Mohamied, Peter Bell, Catherine Lai
2022 conf
SLT
Yuanchao Li, Yumnah Mohamied, Peter Bell, Catherine Lai
2022 Misc conf
ICASSP
Yuanchao Li, Peter Bell, Catherine Lai
2022 A conf
INTERSPEECH
Sarenne Carrol Wallbridge, Catherine Lai, Peter Bell
2022 J jnl
CoRR
Yuanchao Li, Peter Bell, Catherine Lai
2022 J jnl
CoRR
Yuanchao Li, Catherine Lai
2022 A conf
INTERSPEECH
Emelie Van De Vreken, Korin Richmond, Catherine Lai
2021 conf
SSW
Johannah O'Mahony, Pilar Oplustil Gallegos, Catherine Lai, Simon King
2021 J jnl
CoRR
Yuanchao Li, Peter Bell, Catherine Lai
2021 A conf
Interspeech
Sarenne Wallbridge, Peter Bell, Catherine Lai
2021 J jnl
CoRR
Sarenne Wallbridge, Peter Bell, Catherine Lai
2021 J jnl
CoRR
Elijah Gutierrez, Pilar Oplustil Gallegos, Catherine Lai
2021 conf
SSW
Elijah Gutierrez, Pilar Oplustil Gallegos, Catherine Lai
2021 J jnl
IEEE Trans. Affect. Comput.
Michal Muszynski, Leimin Tian, Catherine Lai, Johanna D. Moore, Theodoros Kostoulas, Patrizia Lombardo, Thierry Pun, Guillaume Chanel
2020 J jnl
Speech Commun.
Catherine Lai, Mireia Farrús, Johanna D. Moore
2020 J jnl
CoRR
Zack Hodari, Catherine Lai, Simon King
2019 conf
CHI Extended Abstracts
Aurora Constantin, Catherine Lai, Elaine Farrow, Beatrice Alex, Ruth Pel-Littel, Henk Herman Nap, Johan Jeuring
2019 A conf
INTERSPEECH
Catherine Lai, Beatrice Alex, Johanna D. Moore, Leimin Tian, Tatsuro Hori, Gianpiero Francesca
2018 B conf
ICMI
Gabriel Murray, Hayley Hung, Joann Keyton, Catherine Lai, Nale Lehmann-Willenbrock, Catharine Oertel
2018 conf
GIFT@ICMI
Gabriel Murray, Catherine Lai
2018 J jnl
CoRR
Leimin Tian, Catherine Lai, Johanna D. Moore
2018 conf
MCPMD@ICMI
Catherine Lai, Gabriel Murray
2017 A conf
INTERSPEECH
Peter Bell, Joachim Fainberg, Catherine Lai, Mark Sinclair
2017 conf
ISIAA@ICMI
Leimin Tian, Johanna D. Moore, Catherine Lai
2017 B conf
ACII
Leimin Tian, Michal Muszynski, Catherine Lai, Johanna D. Moore, Theodoros Kostoulas, Patrizia Lombardo, Thierry Pun, Guillaume Chanel
2017 A conf
INTERSPEECH
Janine Kleinhans, Mireia Farrús, Agustín Gravano, Juan Manuel Pérez, Catherine Lai, Leo Wanner
2016 A conf
INTERSPEECH
Catherine Lai, Mireia Farrús, Johanna D. Moore
2016 conf
SLT
Leimin Tian, Johanna D. Moore, Catherine Lai
2015 A conf
INTERSPEECH
Peter Bell, Catherine Lai, Clare Llewellyn, Alexandra Birch, Mark Sinclair
2015 B conf
ACII
Leimin Tian, Johanna D. Moore, Catherine Lai
2015 B conf
ACII
Leimin Tian, Johanna D. Moore, Catherine Lai
2015 A conf
INTERSPEECH
Alessandra Cervone, Catherine Lai, Silvia Pareti, Peter Bell
2014 A conf
INTERSPEECH
Catherine Lai, Steve Renals
2014 conf
CICLing (2)
Johanna D. Moore, Leimin Tian, Catherine Lai
2013 conf
SLaTE
Catherine Lai, Keelan Evanini, Klaus Zechner
2013 A conf
INTERSPEECH
Catherine Lai, Jean Carletta, Steve Renals
2010 J jnl
J. Log. Lang. Inf.
Catherine Lai, Steven Bird
2010 A conf
INTERSPEECH
Catherine Lai
2009 A conf
INTERSPEECH
Catherine Lai
2008 conf
ISMIR
Wei-Ho Tsai, Shih-Jie Liao, Catherine Lai
2007 J jnl
Bull. IEEE Tech. Comm. Digit. Libr.
Catherine Lai, Ichiro Fujinaga
2007 conf
ISMIR
Catherine Lai, Ichiro Fujinaga, David Descheneau, Michael Frishkopf, Jenn Riley, Joseph Hafner, Brian McMillan
2007 A conf
INTERSPEECH
Catherine Lai, Kyle Gorman, Jiahong Yuan, Mark Y. Liberman
2006 conf
ISMIR
Catherine Lai, Ichiro Fujinaga
2006 conf
JCDL
Catherine Lai, Ichiro Fujinaga
2005 C conf
PACLIC
Catherine Lai, Steven Bird
2005 J jnl
Bull. IEEE Tech. Comm. Digit. Libr.
Catherine Lai, Ichiro Fujinaga, Cynthia A. Leive
2005 conf
JCDL
Catherine Lai, Ichiro Fujinaga, Cynthia A. Leive
2005 conf
ISMIR
Catherine Lai, Beinan Li, Ichiro Fujinaga
2005 conf
JCDL
Catherine Lai, Ichiro Fujinaga, Cynthia A. Leive
2004 Misc conf
ALTA
Catherine Lai, Steven Bird
redb/extractors/elf_extractors/elf_segments.py
← Index redb/extractors/elf_extractors/elf_segments.py python
import inspect
import hashlib
import math
from collections import Counter
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 ELFSegment


class ELFSegmentExtractor(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_segments = []
        self.elastic_index = self.index_prefix + "-elf_segments"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _is_empty_result(self, extracted_data) -> bool:
        """
        Override: Empty segments is an ERROR, not a valid empty case.
        A valid ELF file must have segments (program headers).
        """
        # Always return False - empty segments should be treated as an error
        return False

    def _calculate_entropy(self, data: bytes) -> float:
        """Calculate Shannon entropy of data."""
        if not data:
            return 0.0

        try:
            # Count frequency of each byte
            byte_counts = Counter(data)
            data_len = len(data)

            # Calculate entropy
            entropy = 0.0
            for count in byte_counts.values():
                if count > 0:
                    frequency = count / data_len
                    entropy -= frequency * math.log2(frequency)

            return entropy
        except Exception as e:
            self.log.error(f"Error calculating entropy: {e}")
            return 0.0

    def _map_segment_type(self, p_type_str: str) -> int:
        """Map segment type string to enum value."""
        type_map = {
            'PT_NULL': 0,
            'PT_LOAD': 1,
            'PT_DYNAMIC': 2,
            'PT_INTERP': 3,
            'PT_NOTE': 4,
            'PT_SHLIB': 5,
            'PT_PHDR': 6,
            'PT_TLS': 7
        }
        return type_map.get(p_type_str, 0)

    def _decode_segment_flags(self, flags: int) -> List[str]:
        """Decode segment flags to human-readable strings."""
        flag_strings = []

        if flags & 0x1:  # PF_X
            flag_strings.append('EXECUTE')
        if flags & 0x2:  # PF_W
            flag_strings.append('WRITE')
        if flags & 0x4:  # PF_R
            flag_strings.append('READ')

        return flag_strings if flag_strings else ['NONE']

    def _extract_segment_data(self, segment) -> ELFSegment:
        """Extract data from a single segment with granular error handling."""
        # Initialize with safe defaults
        segment_type = 0
        segment_type_str = 'unknown'
        segment_flags = 0
        segment_flags_str = ['NONE']
        segment_offset = 0
        segment_vaddr = 0
        segment_paddr = 0
        segment_filesz = 0
        segment_memsz = 0
        segment_align = 0
        segment_entropy = 0.0
        segment_sha256 = ""
        segment_md5 = ""

        # Try to get segment header
        header = None
        try:
            header = segment.header
        except Exception as e:
            self.log.warning(f"Could not access segment header: {e}")
            return ELFSegment(
                segment_type=segment_type, segment_type_str=segment_type_str,
                segment_flags=segment_flags, segment_flags_str=segment_flags_str,
                segment_offset=segment_offset, segment_vaddr=segment_vaddr,
                segment_paddr=segment_paddr, segment_filesz=segment_filesz,
                segment_memsz=segment_memsz, segment_align=segment_align,
                segment_entropy=segment_entropy, segment_sha256=segment_sha256,
                segment_md5=segment_md5
            )

        # Extract segment type
        try:
            p_type_str = header.get('p_type', 'PT_NULL')
            segment_type = self._map_segment_type(p_type_str)
            segment_type_str = p_type_str.replace('PT_', '') if p_type_str.startswith('PT_') else p_type_str
        except Exception as e:
            self.log.warning(f"Could not extract segment type: {e}")

        # Extract segment flags
        try:
            segment_flags = header.get('p_flags', 0)
            segment_flags_str = self._decode_segment_flags(segment_flags)
        except Exception as e:
            self.log.warning(f"Could not extract segment flags: {e}")

        # Extract segment addresses and sizes
        try:
            segment_offset = header.get('p_offset', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment offset: {e}")

        try:
            segment_vaddr = header.get('p_vaddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment vaddr: {e}")

        try:
            segment_paddr = header.get('p_paddr', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment paddr: {e}")

        try:
            segment_filesz = header.get('p_filesz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment filesz: {e}")

        try:
            segment_memsz = header.get('p_memsz', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment memsz: {e}")

        try:
            segment_align = header.get('p_align', 0)
        except Exception as e:
            self.log.warning(f"Could not extract segment align: {e}")

        # Calculate entropy and hashes for segment data (most likely to fail)
        try:
            if segment_filesz > 0:
                segment_data = segment.data()
                if segment_data:
                    # Calculate entropy
                    segment_entropy = self._calculate_entropy(segment_data)

                    # Calculate hashes
                    segment_sha256 = hashlib.sha256(segment_data).hexdigest()
                    segment_md5 = hashlib.md5(segment_data).hexdigest()
        except Exception as e:
            self.log.warning(f"Could not read segment data for hashing: {e}")
            # Keep defaults (0.0, "", "")

        return ELFSegment(
            segment_type=segment_type,
            segment_type_str=segment_type_str,
            segment_flags=segment_flags,
            segment_flags_str=segment_flags_str,
            segment_offset=segment_offset,
            segment_vaddr=segment_vaddr,
            segment_paddr=segment_paddr,
            segment_filesz=segment_filesz,
            segment_memsz=segment_memsz,
            segment_align=segment_align,
            segment_entropy=segment_entropy,
            segment_sha256=segment_sha256,
            segment_md5=segment_md5
        )

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

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

            def extract_segments(elf):
                segments_data = []

                # Iterate through all segments with per-segment error handling
                for segment_index, segment in enumerate(elf.iter_segments()):
                    try:
                        segment_data = self._extract_segment_data(segment)
                        if segment_data:
                            segments_data.append(segment_data)
                        else:
                            self.log.warning(f"Failed to extract data for segment {segment_index}")
                    except Exception as e:
                        self.log.warning(f"Error processing segment {segment_index}: {e}")
                        # Continue processing other segments

                return segments_data

            # Check if file is valid ELF
            if not self._is_elf_file():
                self.log.error(f"No valid ELF file for {self.hash.sha256}")
                return None

            segments_data = self._with_elf_file(extract_segments)
            if segments_data is None:
                return None

            self.elf_segments = segments_data
            return self.elf_segments

        except Exception as e:
            self.log.error(f"Error extracting ELF segments {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_segments
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_segments:
                    return None

                # Prepare data arrays for all segments
                data = []
                current_time = datetime.now(timezone.utc)
                for segment in self.elf_segments:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        segment.segment_type,
                        segment.segment_type_str,
                        segment.segment_flags,
                        segment.segment_flags_str,
                        segment.segment_offset,
                        segment.segment_vaddr,
                        segment.segment_paddr,
                        segment.segment_filesz,
                        segment.segment_memsz,
                        segment.segment_align,
                        segment.segment_entropy,
                        segment.segment_sha256,
                        segment.segment_md5,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'segment_type', 'segment_type_str', 'segment_flags', 'segment_flags_str',
                    'segment_offset', 'segment_vaddr', 'segment_paddr',
                    'segment_filesz', 'segment_memsz', 'segment_align',
                    'segment_entropy', 'segment_sha256', 'segment_md5',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    "Enum8('NULL'=0, 'LOAD'=1, 'DYNAMIC'=2, 'INTERP'=3, 'NOTE'=4, 'SHLIB'=5, 'PHDR'=6, 'TLS'=7)",
                    'LowCardinality(String)',
                    'UInt32',
                    'Array(LowCardinality(String))',
                    'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64', 'UInt64',
                    'Float64',
                    'FixedString(64)', 'FixedString(32)',
                    '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_segments"