일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- XSS
- 프로그래머스
- 디피헬먼
- 기계학습
- Cross Site Scripting
- db
- dsa
- SQL
- dvwa
- 머신러닝
- SQL_Injection
- 웹
- C언어
- 인공지능
- codeup
- 파일구조
- Database
- RSA
- RVA
- injection
- 코드업
- 딥러닝
- ImageBase
- 공개키
- ReflectedXSS
- StoredXSS
- 알고리즘
- 심층학습
- 암호학
- 보안
- Today
- Total
Ye0ngJae
ELF 구조와 PE 구조 본문
ELF와 PE
ELF : 유닉스 계열에서의 실행파일
PE : 윈도우에서의 실행파일
ELF (Executable and Linkable Format)
리눅스에서 실행 가능한 바이너리와 오브젝트 파일의 형식을 규정한 파일
맨위에는 ELF Header가 위치하고, Program Header Table, n개의 Section이 있으며, 맨 아래에는 Section Header Table로 총 4개로 이루어져 있다.
ELF Header는 ELF 파일의 구성을 나타내는 부분이다. 여기에는 ELF 파일의 특성같은 정보들이 들어가 있으며, ELF 내부에는 세그먼트(런타임 중 사용될 메모리 정보)라 것이 존재한다. 이 때 프로세스 메모리를 어떻게 구현하는지에 대하여 저장하는 부분이다. Section은 실행파일에 대한 정보들을 저장하는 것인데, 기본적으로 파일 데이터, 파일명, 확장자 등의 데이터들을 저장한다.
리눅스에서는 이 ELF 구조를 한 눈에 볼 수 있는 명령어가 있는데 readelf {파일명}으로 볼 수가 있다. readelf 명령어에 부가적인 단어를 붙이면, ELF 구조 내부에 있는 ELF Header, Program Header table 등 ELF 구조의 구성들을 볼 수 있다.
Section에는 여러가지가 있는데 주요 섹션을 알아보자면 다음과 같다.
.test : 프로그램의 실행 가능한 명령어가 저장되는 곳
.data : 초기화 된 전역 변수, 정적 변수가 저장되는 곳
.bss : 초기화가 되지 않은 변수가 저장되는 곳 (0으로 자동 초기화 해줌)
.rodata : 읽기 전용 데이터(문자열과 상수가 저장됨)
PE (Portable Executable)
윈도우에서 실행 가능한 실행 파일, DLL Object 등의 형식을 규정한 파일
예)exe, src, obj, dll, sys 등
PE 파일은 크게 PE Header와 PE Body가 있는데 PE Body는 Section Header 영역과 Section 영역을 통칭하는 부분이다.
PE Body 부분에는 프로그램의 주요 정보가 들어간다. ELF 파일 구조에서는 중간중간에 NULL이 없지만 PE 파일에서는 NULL을 이용하여 Padding을 해놓았다. 이는 최소단위 때문인데, 메모리에서 데이터를 처리할 때 효율적으로 데이터를 처리하기 위함이다.
※최소단위 : 파일, 메모리 등에서 데이터를 처리할 때 효율적으로 동작할 수 있도록 메모리를 구성하게 하는 최소한의 단위
VA & RVA
VA : Virtual Adress (절대주소)
RVA : Relative Virtual Adress (상대주소)
RVA와 ImageBase를 더해서 절대주소로 만들어준다. PE 파일이 메모리에 들어가기전의 ImageBase 상태는 0이다.
그러면 왜 VA와 RVA로 나누어 놓은 것일까?
답은 효율적인 일처리를 위해서이다. 실행 파일이 메모리에 들어갈 때 절대 주소로 들어가게 된다면, 컴퓨터는 이를 찾는 것에 대하여 비효율적으로 동작한다. RVA가 메모리에 들어가면 ImageBase를 기준으로 이동을 한 후 절대 주소를 찾는다. 따라서 RVA는 메모리의 어느 위치로 들어가냐에 따라서 계속 달라진다.
※ImageBase : 임의로 만들어 놓은 어느 한 위치(0x00)
과제
x64dbg 단축키
F2 | BP 생성 |
Ctrl + F2 | 재시작 |
F7 | call 명령어 함수 주소 이동 |
F8 | call 명령어 함수 주소 이동 없이 실행 |
F9 | 프로그램 실행 |
Ctrl + F9 | call 명령어 내부에서 돌아갈 때까지 실행 |