Jae Young Ahn

39 papers B 4Misc 1Journal 13Unranked 21
YearRankTypeTitle / Venue / Authors
2023 J jnl
IEEE Trans. Intell. Transp. Syst.
Yongjun Lee, Yoola Hwang, Jae Young Ahn, Jiwon Seo, Byungwoon Park
2022 J jnl
CoRR
Yongjun Lee, Yoola Hwang, Jae Young Ahn, Jiwon Seo, Byungwoon Park
2020 J jnl
Future Gener. Comput. Syst.
Gicheol Wang, Byoung-Sun Lee, Jae Young Ahn, Gihwan Cho
2019 conf
FiCloud
Soojeon Lee, Byoung-Sun Lee, Jae Young Ahn
2018 J jnl
Secur. Commun. Networks
Gicheol Wang, Byoung-Sun Lee, Jae Young Ahn, Gihwan Cho
2018 conf
ICTC
Yeonjoon Chung, Jae Young Ahn, Jae Du Huh
2018 conf
FiCloud
Gicheol Wang, Byoung-Sun Lee, Jae Young Ahn
2018 conf
ICTC
Kwangjae Lim, Hee Wook Kim, Tae-Chul Hong, Jae Young Ahn
2017 conf
FiCloud Workshops
Gicheol Wang, Kwangjae Lim, Byoung-Sun Lee, Jae Young Ahn
2017 conf
ICTC
Tae-Chul Hong, Kunseok Kang, Kwangjae Lim, Byoung-Sun Lee, Jae Young Ahn
2017 conf
ICTC
Hee Wook Kim, Kunseok Kang, Kwangjae Lim, Byoung-Sun Lee, Jae Young Ahn
2017 conf
ICTC
Kwangjae Lim, Hee Wook Kim, Tae-Chul Hong, Jae Young Ahn
2016 conf
FiCloud Workshops
Gicheol Wang, Byoung-Sun Lee, Jae Young Ahn
2016 conf
ICTC
Tae-Chul Hong, Kunseok Kang, Kwangjae Lim, Jae Young Ahn
2016 conf
ICTC
Hee Wook Kim, Kunseok Kang, Kwangjae Lim, Jae Young Ahn
2016 conf
ISOCC
Tae-Chul Hong, Kunseok Kang, Kwangjae Lim, Jae Young Ahn
2014 J jnl
IEEE J. Sel. Top. Signal Process.
Junyoung Nam, Ansuman Adhikary, Jae Young Ahn, Giuseppe Caire
2014 conf
ICTC
Hee Wook Kim, Dae-Ig Chang, Jae Young Ahn
2013 J jnl
IEEE Trans. Inf. Theory
Ansuman Adhikary, Junyoung Nam, Jae Young Ahn, Giuseppe Caire
2013 B conf
ISIT
Junyoung Nam, Jae Young Ahn
2012 J jnl
IEEE Commun. Lett.
Kab Seok Ko, Min Jeong Kim, Kuk Yeol Bae, Dan Keun Sung, Jae Heung Kim, Jae Young Ahn
2012 J jnl
Int. J. Distributed Sens. Networks
Sungmo Jung, Jae Young Ahn, Dae-Joon Hwang, Seoksoo Kim
2012 J jnl
CoRR
Ansuman Adhikary, Junyoung Nam, Jae Young Ahn, Giuseppe Caire
2012 Misc conf
CISS
Junyoung Nam, Jae Young Ahn, Ansuman Adhikary, Giuseppe Caire
2010 B conf
GLOBECOM
Junyoung Nam, Jeongseok Ha, Jae Young Ahn
2010 conf
SUComS
Jaegu Song, Jae Young Ahn, Seoksoo Kim
2010 J jnl
Sensors
Sungmo Jung, Jaegu Song, Dae-Joon Hwang, Jae Young Ahn, Seoksoo Kim
2010 conf
FGIT-ASEA
Jae Young Ahn, Jaegu Song, Dae-Joon Hwang, Seoksoo Kim
2008 conf
VTC Fall
Junyoung Nam, Seong Rag Kim, Jeongseok Ha, Jae Young Ahn
2007 J jnl
IEEE Trans. Veh. Technol.
Kwang Soon Kim, Sung Woong Kim, Yong Soo Cho, Jae Young Ahn
2006 J jnl
IEICE Trans. Commun.
Dong Han Kim, Kwang Soon Kim, Jae Young Ahn, Yong Soo Cho
2006 conf
VTC Fall
Kyu In Lee, Kyung-Soo Woo, Yo Han Ko, Jae Young Ahn, Yong Soo Cho
2006 conf
VTC Spring
Bangwon Seo, Jae Young Ahn, Hyung-Myung Kim
2006 conf
ICOIN
Byungjoo Lee, Hyukjoon Lee, Seung Hyong Rhee, Jae Kyun Kwon, Jae Young Ahn
2006 conf
VTC Spring
Sung Kyo Kang, Yun Hee Kim, Jae Young Ahn
2005 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Sang Hyun Lee, Kwang Soon Kim, Yun Hee Kim, Jae Young Ahn
2005 B conf
PIMRC
Kyung Won Park, Kyu In Lee, Jae Young Ahn, Yong Soo Cho
2005 B conf
ISIT
Sang Hyun Lee, Kwang Soon Kim, Jae Kyun Kwon, Yun Hee Kim, Jae Young Ahn
2004 conf
ICC
Yun Hee Kim, Kwang Soon Kim, Jae Young Ahn
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"