ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ELF 파일 포맷(3)
    Linux System 2019. 3. 14. 13:16

    ELF Section Header


    - 섹션 헤더는 프로그램 메모리 레이아웃을 정의하지 않는다.

     

    즉, 프로그램 실행에 필수 요구 정보는 아니다. -> 섹션 헤더 테이블이 없어도 정상 동작이 가능하다.


    프로그램 메모리 레이아웃의 경우 프로그램 헤더 테이블이 정의를 하게 되고, 섹션 헤더는 이를 보완해주는 역할만 한다.


    but, 바이너리 코드에서 섹션 헤더를 제거하면, 그 섹션이 어느 곳에 위치하는지 알 수도, 참조할 수도 없게 된다. 이 때 디버거, 디스어셈블러는 더 제한된 정보만을 참조하여 작업해야한다.

    (objdump, objcopy, gdb등의 툴 사용에 제약이 생긴다. - 리버스 엔지니어링에서 사용하는 분석 툴들은 대부분 섹션 헤더를 참조한다.)


    따라서 모든 ELF 객체는 섹션을 가지지만, 섹션 헤더를 갖는 것은 아니다.


    하지만, 섹션 헤더 테이블이 제거 되었어도, 프로그램 헤더로 부터 적절한 정보를 추출해 섹션 헤더 테이블과 심볼 테이블의 일부를 복원하는 것도 가능하다.


     

    - 섹션은 세그먼트의 구성 요소라고 볼 수 있다. (각 세그먼트는 섹션을 구성 요소로써 가진다.)



    - 32비트 ELF 섹션 헤더

    typedef struct {

    uint32_t sh_name        // shdr 이름을 나타내는 shdr 문자열 테이블 오프셋

    uint32_t sh_type         // shdr 형식. 

    uint32_t sh_flags         // shdr 플래그

    Elf32_Addr sh_addr      // 섹션의 시작 주소

    Elf32_Off sh_offset       // 파일의 엔트리 포인트로부터의 shdr 오프셋

    uint32_t sh_size           // 디스크에 할당된 섹션 크기

    uint32_t sh_link           // 다른 섹션으로의 포인터

    uint32_t sh_info           // 섹션 형식

    uint32_t sh_addralign    // 섹션 재배열 주소

    uint32_t sh_entsize       // 섹션 엔트리 크기

    }Elf32_Shdr

    1. 섹션 헤더 형식(sh_type)

    0x00. SHT_NULL : 해당 섹션이 비활성화 되었음을 의미한다.


    0x01. SHT_PROGBITS : 프로그램에 의해 정의된 정보임을 의미. 즉, 가장 일반적인 섹션을 의미한다.


    0x02. SHT_SYMTAB : 해당 섹션은 symbol table을 가지고 있음을 의미한다. 이 섹션은 정적 또는 동적 링킹을 위한 심볼 정보를 제공한다.


    0x03. SHT_STRTAB : 해당 섹션은 string table을 가지고 있음을 의미한다. 


    0x04. SHT_RELA : 해당 섹션은 재배열 엔트리(relocation entries) 정보를 Elf32_Rela 타입의 형태로 가진다. 


    0x05. SHT_HASH : 해당 섹션은 symbol hash table을 가지고 있음을 의미한다. 동적 링킹을 해야 하는 파일의 경우 해시 테이블을 가져야만 한다.


    0x06. SHT_DYNAMIC : 해당 섹션은 동적 링킹 정보를 가지고 있음을 의미한다. dynamic section은 오직 1개만 가질 수 있다.


    0x07. SHT_NOTE


    0x08. SHT_NOBITS : 해당 섹션은 파일에서 공간을 차지하지 않는다. 이 특징을 제외하고는 SHT_PROGBITS와 거의 동일하다.


    0x09. SHT_REL : 해당 섹션은 재배열 오프셋(relocation offset)을 Elf32_Rel 타입 형태로 갖는다.


    0x0A. SHT_SHLIB : 해당 섹션은 리저브 되었음을 의미한다.


    0x0B. SHT_DYNSYM : 해당 섹션은 동적 링킹 심볼 정보를 담고 있음을 의미한다.


    0x0C. SHT_LOPROC

    0x0D. SHT_HIPROC

    0x0E. SHT_LOUSER

    0x0F. SHT_HIUSER


    2. sh_link

    - SHT_REL 타입의 sh_link에는 .symtab의 섹션 헤더 인덱스 값이 저장된다.

    - SH_SYMTAB 타입의 sh_link에는 .strtab의 섹션 헤더 인덱스 값이 저장된다.


    각 섹션에 대해 살펴 보자.


    1. .text 섹션

    - 코드 섹션으로 프로그램 코드 명령어가 저장된다.

    - SHT_PROGBITS 섹션 형식을 따르며, 텍스트 세그먼트에 존재한다.


    2. .rodata 섹션

    - 읽기 전용 데이터 섹션으로 문자열 등이 저장된다.

    - 이 섹션은 읽기 전용이므로 반드시 읽기 전용 세그먼트에 존재해야 한다.

    ( 따라서 데이터 세그먼트가 아닌 텍스트 세그먼트에 위치 할 때도 있다.)

    - SHT_PROGBITS 섹션 형식을 따른다.


    3. .plt 섹션 (Procedure Linkage Table)

    - 동적 링커가 공유 라이브러리에서 import한 함수를 호출하기 위한 정보가 담긴다.

    - 이 정보에는 코드가 포함되어 있다. 따라서 텍스트 세그먼트에 위치한다.

    - SHT_PROGBITS 섹션 형식을 따른다.


    4. .data 섹션

    - 초기화된 전역 변수 등의 데이터를 저장한다. 따라서 데이터 세그먼트에 존재한다.

    - SHT_PROGBITS 섹션 형식을 따른다.


    5. .bss 섹션

    - 초기화 되지 않은 전역 데이터를 저장한다. 따라서 데이터 세그먼트에 존재한다.

    - 디스크 상에서는 섹션의 존재를 나타내기 위해 4바이트만 크기를 차지하지만, 프로그램이 로드될 때 원래의 크기를 갖고 0으로 초기화된 값으로 채워져 할당/정렬되어 실행된다.

    - 실제 데이터를 가지지 않아 SHT_NOBITS 섹션 형식을 가진다.


    6. .got.plt 섹션 (Global Offset Table)

    - 이 섹션과 PLT 정보를 통해 import된 공유 라이브러리 함수에 접근이 가능하다.

    - 동적 링커에 의해 런터임에 정보가 수정될 수 있다.

    - got overwrite 라는 익스플로잇 공격이 이 섹션의 주소를 덮어쓰는 공격이다.

    - 프로그램 실행과 관련이 있으므로 SHT_PROGBITS 섹션 형식을 가진다.


    7. .dynsym 섹션

    - 공유 라이브러리로부터 import된 동적 심볼 정보를 담고 있다.

    - 이 섹션은 텍스크 세그먼트에 존재한다.

    - SHT_PROGBITS 섹션 형식을 따른다.


    8. .dynstr 섹션

    - 동적 심볼 문자열 테이블 정보를 담고 있다.


    9. .rel.* 섹션

    - 재배열 섹션은 ELF 객체 또는 프로세스 이미지의 어떤 부분이 링킹 시(여러 오브젝트 파일을 링킹할 때) or 런타임에서 재배열 되어야 하는지 알려준다. -> 즉 위치 오프셋

    - 재배열 데이터가 내부에 포함되며, SHT_REL 섹션 형식을 가진다.


    10. .hash 섹션 (= .gnu.hash 섹션)

    - 심볼 참조 해시 테이블

    - 리눅스 ELF에서 사용하는 심볼 이름 참조 코드이다.

    uint32_t dl_new_hash (const char * s) {

    uint32_t h = 5381;

    for (unsigned char c = *s; c != '\0'; c= *++s)

    h = h * 33 + c;             // h = ((h << 5) + h) + c 로 구현하는 것이 일반적

    return h;

    }


    11. .symtab 섹션

    - ElfN_Syn 형식의 심볼 정보를 담고 있다.

    - SHT_SYMTAB 섹션 형식을 가진다.


    12. .strtab 섹션

    - .symtab 섹션의 ElfN_Sym 구조체에 존재하는 st_name 엔트리에 의해 참조되는 심볼 문자열 테이블 정보를 담고 있다.

    - 문자열 테이블이 위치하기 때문에 SHT_STRTAB 섹션 형식을 갖는다.


    13. .shstrtab 섹션

    - null 종료 문자열과 각 섹션의 이름을 나타내는 섹션 헤더이다.

    - 문자열 테이블을 담고 있다.

    - ELF 파일 헤더의 e_shstrndx포인터 & .shstrtab의 오프셋에 의해 참조된다.

    - 문자열 테이블을 가지므로 SHT_STRTAB 섹션 형식을 가진다.


    14. .ctors / .dtors 섹션 ( Constructors, 생성자 / Destructors, 소멸자)

    - 초기화 및 종료 함수 포인터를 포함한다. -> 각각은 main() 함수 호출 이전 / 이후에 실행이 된다.

    - 안티 디버깅에 자주 활용이 된다.


    'Linux System' 카테고리의 다른 글

    ELF 파일 포맷(2)  (0) 2019.03.11
    ELF 파일 포맷(1)  (0) 2019.03.11
    라이브러리  (0) 2019.03.11
    파일 디스크립터  (0) 2019.03.10

    댓글

Designed by Tistory.