-
ELF 파일 포맷(3)Linux System 2019. 3. 14. 13:16
ELF Section Header - 섹션 헤더는 프로그램 메모리 레이아웃을 정의하지 않는다. 즉, 프로그램 실행에 필수 요구 정보는 아니다. -> 섹션 헤더 테이블이 없어도 정상 동작이 가능하다. 프로그램 메모리 레이아웃의 경우 프로그램 헤더 테이블이 정의를 하게 되고, 섹션 헤더는 이를 보완해주는 역할만 한다. but, 바이너리 코드에서 섹션 헤더를 제거하면, 그 섹션이 어느 곳에 위치하는지 알 수도, 참조할 수도 없게 된다. 이 때 디버거, 디스어셈블러는 더 제한된 정보만을 참조하여 작업해야한다.(objdump, objcopy, gdb등의 툴 사용에 제약이 생긴다. - 리버스 엔지니어링에서 사용하는 분석 툴들은 대부분 섹션 헤더를 참조한다.) 따라서 모든 ELF 객체는 섹션을 가지지만, 섹션 헤더를..
-
ELF 파일 포맷(2)Linux System 2019. 3. 11. 13:06
ELF Program Header : 프로그램 로딩에 필요한 바이너리 세그먼트를 정의. 세그먼트 디스크에 저장된 실행파일이 커널에 의해 로드되는 과정에서 어떤 메모리 구조로 매핑될 것인지를 정의(즉, 프로그램을 메모리에 로드하는 로더가 ELF 파일을 다룰 때의 단위. 각 구성은 Read Only, Read and Write, Write Only등의 속성에 세그먼트를 분리) - 실행 가능 파일에만 존재 한다. (물론 공유 Obejct 파일에도 존재한다.) - 여러 Linkable 파일들의 섹션들을 링커가 돌면서 통합해주고, 이것들에 대한 정보를 ELF Program Header에 갖는다. -> 즉, 섹션과 세그먼트는 완전히 서로 별개의 것이 아니다.일종의 유사한 섹션들을 모아 놓은 것이 세그먼트섹션 : 링..
-
ELF 파일 포맷(1)Linux System 2019. 3. 11. 03:48
ELF(Excutable and Linkable Format) 단순하게 말하면 그냥 리눅스/유닉스에서의 실행파일 디스크에 저장되어 있던 프로그램이 메모리 영역에 올라가서 컴퓨팅 자원을 사용하여 서비스를 제공해주는 것. ELF에서는 프로그램이 실행될 때 메모리에 올라가야 할 각각의 부분들을 미리 정리하여 관리하다가 실행을 하게 되면 정리된 부분들(코드, 전역데이터, 읽기 전용 데이터 등등)을 메모리에 올리게 된다. (이 때 며가지 영역이 덧 붙게 된다.) 이렇게 메모리에 올라온 주소 공간의 .text 섹션(코드 영역)의 Instruction을 한 라인씩 실행하며 프로세스가 진행된다. Linkable이란? 라이브러리 예를 가지고 살펴보면,foo와 my_data의 정의가 main에 존재하지 않는다. 이 때, ..
-
라이브러리Linux System 2019. 3. 11. 01:21
라이브러리 정리를 도와주실 코드 3분을 모셔봤다.우선 헤더파일(*.h)은 그 자체로는 *.c 파일을 가리킬 수 없다. 1. 헤더 파일에 선언 뿐 아니라 구현까지 다 해놓던가2. 각 소스코드를 기계어 코드로 바꾼 뒤 링킹을 하던가3. 아니면 라이브러리를 쓰던가 1. 처음에 많이 사용하는 2번 방식.-> 위 예를 컴파일 하게 되면 "gcc main.c my_lib.c -o main" 이런 식으로 하게 됨.이를 뜯어보면-> 위 예를 보면 main.c에는 전역변수 my_data 선언과 함수 foo 구현이 없음. 그래서 main.c를 main.o로 바꿔도 my_data, foo의 심볼을 알 수가 없음. (즉, 완벽한 기계어로 바뀌지 않고 비어있음) -> 이 불완전한 main.o(ELF파일)의 포맷 중 .rel.t..
-
파일 디스크립터Linux System 2019. 3. 10. 23:01
- 유닉스 계열에서 모든 객체들(정규파일, 디렉터리, 소켓, 파이프 등등)은 모두 '파일'로써 관리가 됨. - 시스템에서 이 파일들을 접근할 때, 파일 디스크립터를 이용 - 프로세스가 실행 중에 파일을 오픈하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값, fd값을 할당 이후 프로세스가 열려있는 파일에 시스템 콜을 이용해 접근할 때, fd값을 이용하여 파일을 지칭. fd값에는 기본적으로 할당되는 파일 디스크립터가 존재 표준 입력 : STDIN_FILENO -> 0표준 출력 : STDOUT_FILENO -> 1표준 에러 : STDERR_FILENO -> 2에서 파악할 수 있음 - 리눅스에서는 프로세스마다 파일 디스크립터 테이블을 가지고 있음. 파일 디스크립터 테이블은 op..