R e d A l i e n Click

엄청난 기술을 접하면, 마치 외계인의 기술을 훔친 것과 같다고 말합니다

붉은외계인은 그러한 놀라운 기술을 탐구하고, 기술적인 도전에 맞서는 것을 의미하는 저의 또 다른 이름입니다

서로가 성장할 수 있는 건설적인 토론을 좋아합니다.

article_thumbnail

[붉은외계인] CS - 목적 파일, 실행파일 그리고 ELF, PE 포멧까지

2024. 2. 7.
클릭 시, 이동!

2024.02.07 - [Mobile] - [붉은외계인] Mobile - Diva Hardcoding Issues - Part 2

 

[붉은외계인] Mobile - Diva Hardcoding Issues - Part 2

Nox 에뮬레이터에, 취약한 모바일 앱인 diva를 통하여 공부를 하던 도중 상당히 재미있었던 부분을 정리할려고 한다 시작해보자 Hardcoding Issues - Part 2 Part 1은 정말 쉬웠으나, Part 2는 jadx를 통해 디

redalien.tistory.com

이전 게시물에서 취약한 어플 점검을 하면서, 부족하다 느낀 배경 지식들을 공부하였다

이리저리 구글링 하면서 정리하고, 또 정리한 내용들이 맞는지 여러 번 검토한 결과, 나름 완성도 있게 정리하였다
오늘 내용은 목적 파일과 실행 파일, 그리고 ELF와 PE 포멧에 대하여 알아볼 것이다 

시작하겠다

 


 

고급 언어와 저급 언어

가장 먼저, 고급 언어와 저급 언어에 대해서 이해해야한다

지금까지 공부한 내용들을 업데이트하면서 적용한 결과, 아래 구조도로 정리할 수 있다
중요한 포인트는 어떤 언어이던간에 결국에는 기계어로 변환된 다음에 CPU에게 전달된다는 것이다

여기서 Managed Code는 하드웨어와 OS에 종속되지 않는 코드를 말하며, Interpreter 언어가 대표적이다
Native Code는 그와 반대로, 하드웨어와 OS에 종속되는 코드이며 Linux에 맞게 컴파일 됐다면 Linux 환경에서만 
작동된다 또한 x86_64로 컴파일 했다면 x86_64에서만 작동된다

이러한 내용을 이해하였다면 원시 코드와 목적 코드를 이해할 수 있다

 

원시 코드 : 고급 언어의 프로그래밍 코드를 말한다
목적 코드 : 기계어를 의미한다

 


 

C언어에서의 컴파일 과정 

C언어에서의 컴파일 과정은 위의 구조도와 같다
각 과정은 간단하게 설명하겠다

 

● 전처리 과정
코드에 명시한 라이브러리의 코드를 불러와 대입함으로써, 컴파일을 준비하는 과정이다 
전처리 과정을 거쳐 만들어진 전처리 파일은 아직, 소스 코드 형태이다

● 컴파일 과정
전처리 파일의 코드를 어셈블리리어로 변환하는 과정이다
이러한 어셈블리어의 형태는 OS와 CPU 아키텍처마다 매 번 달라진다

● 어셈블 과정
어셈블리어를 기계어(목적 코드)로 바꾸는 과정이다
목적 코드로 이루어진 파일을 목적 파일 = Object File = 객체 파일 이라고 한다
현재 상태의 목적 코드는 Relocatable Object File 이며, 정적 라이브러리가 될 수 있다
( 해당 내용은 아래에서 자세하게 설명하겠다 )

● 링킹 과정
목적 파일들을 묶어, 하나의 실행 파일로 만드는 과정이다
현재 상태의 목적 코드는 Executable Object File 이며, 바로 실행될 수 있는 형태이다

여기서 실행 파일이 실행된 후, 실행 파일이 Sharded Object 파일의 리소스를사용할 때만  Shared Object File
메모리에 적재된다 동적 라이브러리라고 부른다

중요한 점은 Relocatable Object File과 Executable Object File은 똑같이 기계어로 이루어져 있으나 
다르다는 점이다 ( 아래에서 자세하게 설명하겠다 )

 


 

링킹( Linking )과정의 이해

 

위에서 언급하였듯, 링킹 과정은 목적 파일을 묶어 하나의 실행 파일로 만드는 과정이라고 하였다

더 자세하게 말하자면, Relocatable Object File을 메모리에 바인딩 하는 과정이며, 이것을 Linker가 수행한다
여기서 Relocatable Object 파일과 Executable Object 파일의 차이가 발생한다


objdump 혹은 readelf 유틸을 사용하면 Relocatable Object 파일과
링킹 과정을 거친 Executable Object 파일의 차이를 확인할 수 있다

이를 위해, gcc 컴파일러를 사용하여 목적 파일과 실행 파일을 생성하였다

 

 

첫 번째 사진이 Relocatable 파일이고, 두 번째 사진이 Executable 파일이며, 모두 Symbol table을 조회한 상태이다

포인트는 Relocatable 파일의 메모리 주소는 바인딩 되어 있지 않은 상태이고,
Executable 파일은 메모리 주소가 바인딩 된 상태라는 것이다 Executable 파일은 메모리 주소가 바인딩 되어 있기 때문에, 실행을 하면 해당 메모리 주소로 적재되면서 바로 실행이 가능하다

이러한 이유로, Relocatable 파일을 재배치 가능한 Object 파일이라고 부르는 것이고
Executable 파일을 실행 파일이라고 부르는 것이다
( 물론 직역하면 똑같은 말이나, 왜 이러한 이름을 붙였는지 이해가 됐을 거라 생각한다 )

 


 

그래서, ELF와 PE 포멧이 뭔가

구조도를 다시 보자

ELF, PE 포멧은 목적파일의 표준 파일 구조이며, OS 환경에 따라 사용되는 포멧이 다르다

간단하게 생각하면, 위의 그림에서 빨간 네모에 해당하는 파일은 모두 ELF, PE 포멧이라 볼 수 있다
( 윈도우의 경우, 파일의 포멧은 PE 포멧으로 동일하나 확장자가 다르다 )

 

위의 표로 간단하게 정리할 수 있다