본문 바로가기

Layer7

리버싱 6차시 과제(ELF, PE)

ELF

 

"Executable and Linkable Format"의 약자로

실행 가능한 바이너리(Executable) 또는 오브젝트 파일 등의 형식(Format)을 규정한 것이며,

리눅스와 유닉스 계열 OS(운영체제)에서의 표준 바이너리 실행 파일 형식이다.

프로그램이 실행될 때 하드디스크에서 메모리로 올라가야 할 것들을 (ex: 코드) 미리 모아서 정리해주고,

실행이 될 때 정리된 부분들을 메모리에 올린다.

 

 

 

 

<오브젝트 파일의 세 가지 종류>

 

실행 가능한 오브젝트 파일(Executable object file) : 바로 실행할 수 있는 파일

재배치 가능한 오브젝트 파일(Relocatable object file) : 나중에 할 링킹을 위해서 다른 오브젝트 파일 하고 연결하기 위해

                                                                                        여러 가지 정보들을 심어놓은 파일

공유 오브젝트 파일(Shared object file)재할당(다시 갈라서 나누는 것)이 가능한 데이터를 정적 혹은 동적으로 

                                                                다른 공유 오브젝트들과 공유할 수 있도록 하는 파일이다.

 

 

-ELF 파일 구조

 

https://docs.oracle.com/cd/E19683-01/816-1386/6m7qcoblj/index.html

 

ELF 파일은 Linking View와 Execution View, 두 가지 view가 있다.

 

Linking View: 링킹 하기 전의 오브젝트 파일의 형식이다. relocatable file이라고 한다. ==>(. o)

Execution View: 링킹이 완전히 끝나고 실행이 가능하게 된 파일의 형식이다. Executable object file이라고 한다.

 

구조는   ELF헤더 + 프로그램 헤더 테이블  +  섹션 헤더 테이블  이렇게 이루어져 있다.

*고정된 ELF 헤더 말고는 위치 순서가 정해져 있지 않음

*linking view에서는 프로그램 헤더 테이블이 없을 수도 있음

 

 

 

- ELF HEADER

 

현재의 ELF 파일에 대한 정의를 하며, 파일의 구성과 특성을 보여준다.

파일의 맨 앞부분에 있고, Linking View와 Execution View 둘 다 필수적으로 있다.

Program header table, Section header table이 어느 부분에 있을지 위치를 결정한다.

Zero offset(상대 주소 0)에서 시작하고, 매직넘버는 ELF (0x7 F 0x45 0x4 C 0x46)이다.

 

오프셋: 주어진 지점까지의 거리를 나타내는 정수형이다. 상대 주소라고 불림.

매직 넘버(magic number) : 파일이 어떤 형식(Format)인지를 적어놔서 확장자가 바뀌어도

                                            올바르게 인식할 수 있도록 하는 기능을 하고 파일 맨 첫 번째에 있다. 

 

 

xxd [파일명]  명령어로 파일 prob3의 hex dump를 만들어 주었다. 

 

hex dump : 컴퓨터 데이터를 16진법으로 표현한 것

 

<오프셋(상대 주소)>                 <16진수>                     <아스키코드>

 

 

 

 

 

 

 

 

 

 

 

readelf -h [파일명] 명령어로 prob3의 ELF Header를 한눈에 볼 수 있게 해 주었다.

 

 

https://pu1et-panggg.tistory.com/32

 

 

 

-PROGRAM HEADER TABLE

 

실행파일의 메모리 구조 내용을 표시한다.

시스템에 어떻게 프로세스 이미지를 만들지를 지시한다.

프로세스의 이미지를 만들기 위해서 사용되는 파일은 반드시 이 헤더 테이블이 있어야 하는데

재배치 가능 파일((Relocatable object file), 링킹 전 오브젝트 파일)의 경우엔 없어도 된다.

 

프로세스 이미지: 프로세스 제어블록에 정의된 프로그램과 데이터, 스택, 속성, 들의 집합

 

 

readelf -l [파일명] 명령어로 프로그램 헤더를 한눈에 볼 수 있게 해 주었다.

 

 

https://pu1et-panggg.tistory.com/32

 

 

 

-SECTION HEADER TABLE

 

section의 이름과 종류, 적재되는 주소, 파일 내 오프셋(상대 주소), 크기, 성격 등을 보여준다.

 

Segment(세그먼트) : 동일한 메모리 속성(read-only, writable 등)을 가진 하나 또는 그 이상의 섹션의 집합

Section(섹션): 특정 정보(machine instructions, symbol table 등)를 포함하고 있는 ELF file의 작은 조각

 

 

 

<주요한 섹션 종류>

.text 실행 가능한 명령어를 포함
.rodata -read-only데이터를 가지는 섹션
-프로세스의 쓰기가 되지 않는 세그먼트 이미지를 만들때 사용
.data 초기화된 데이터들이 들어있음
.bss
-bss는 block storage start의 약자
-초기화 되지 않은 데이터들을 가지고 있음
-프로그램이 시작할때 여기 있는 데이터들은 0으로 초기화 됨 -파일 공간을 차지 하지 않음

.symtab 심볼 테이블 섹션으로
 함수이름, 전역변수 같은 심볼들을 담고 있음
.dynsym 동적 심볼 테이블 섹션으로
파일이 꺼내고 넣는 모든 심볼을 담고 있음

 

심벌(Symbol): 변수, 함수

심벌 테이블(symbol table): 컴파일러가 코드를 생성하기 위해서 변수, 함수의 이름과

                                            데이터의 주소를 저장하는 테이블.

심볼 테이블 :&nbsp;https://linuxism.ustd.ip.or.kr/114

 

                                         

 

readelf -s [파일명] 명령어로 섹션 헤더를 한눈에 볼 수 있게 해 주었다.

 

 

https://pu1et-panggg.tistory.com/32

 

 

 

PE

 

"Portable Executable"의 약자이며, 나의 실행파일을 다양한 운영체제에서 실행할 수 있다는 뜻으로

이식 가능한 실행파일(PE)’로 이름이 지어졌다고 한다.

exe(실행), sys(드라이버), dll(라이브러리), obj(오브젝트)등의 파일들이 PE에 해당된다.

윈도 실행파일이라고 부르며, 윈도우 OS(운영체제)에서 사용되는 실행파일 형식을 의미한다.

PE 파일은 32bit 형태의 실행파일이기 때문에 PE32라고도 불린다. 64bit일 때는 PE+ or PE32+라고 불린다.

 

 

 

 

 

PE 구조

 

아래 사진은 PE 파일이 메모리에 적재될 때의 모습이다

 

 

 

<PE 파일의 구조>

 PE Header : DOS header ~ Section Header(". rsrc")

 PE Body: Section(". test")  ~ Section(". rsrc")

 

 

여러 가지 정보가 PE헤더에 구조체 형식으로 저장되어 있다. 

파일은 offset(상대 주소)으로, 메모리는 VA(Virtual Address, 절대 주소)로 위치를 나타낸다.

파일의 내용은 코드(. text), 데이터(. data), 리소스(. rsrc) 섹션에 나뉘어서 저장된다.

 

섹션 헤더에는 섹션의 크기, 위치, 속성 등이 정의되어 있고,

PE헤더의 끝부분과 섹션의 끝부분에는 NULL 이 있다.

왜 NULL값이 있냐면 컴퓨터에서는 파일, 메모리, 네트워크, 패킷 등을 처리할 때 효율을 높이기 위해

최소 기본단위 개념을 사용하는데 PE 파일에도 같은 개념이 적용되었기 때문이다.

 

파일과 메모리에서 섹션 또는 섹션의 시작은 최소 기본 단위의 배수에 해당되는 위치고 나머지는 NULL로 채워진다.

 

 

 

<RVA & VA>

VA:  프로세스의 가상 메모리의 절대 주소소

RVA:  어느 기준 위치에서부터 상대 위치 

 

VA와 RVA의 관계는 RVA(상대 주소) + ImageBase = VA(절대 주소)인데

여기서 Imagebase는 메모리에서 PE 파일이 어디에 로딩이 되는지 메모리에 로딩되는 시작 주소를 알려준다.

파일을 실행하게 되면 프로세스에 있는 가상의 메모리 주소 공간에 실행한 파일이 올라가는데,

가상의 메모리이기 때문에 파일이 어디에 로딩되었는지 시작 주소를 알고 있어야 그 파일에 접근할 수 있다.

접근하기 위해 실제 주소와 가상 주소를 연결해 주는 것을 매핑이라고 하고,

그 매핑되는 위치가 ImageBase(시작 주소)인 것이다.

 

VA(절대 주소)는 ImageBase를 기준으로 만들어지고,

실제 메모리에서는 이 절대 주소를 보고 그 위치에 있는 명령을 실행한다.

 

PE안에서는 상대 주소로 주소가 적혀있게 되는데, 굳이 상대 주소와 절대 주소를 나눠놓고 상대 주소를 쓰는 이유는

주소 값이 바뀌거나  VA주소에 이미 다른 프로그램이 로딩되어 있을 때 기준이 없어서 충돌이 나기 때문이다.

상대 주소로 PE안에 들어간다면 주어진 imagebase에서 얼마만큼 떨어진 곳으로 가면 된다.

그래서 imagebase 와 상대주소가 있다면 절대주소를 구할 수 있다