SimpleVM 풀기 전 공부 1

2018. 6. 1. 04:110x02 Reverse Engineer/0x02. Reversing.kr

728x90

SimpleVM에서 EntryPoint를 복구하는 것이 첫 번째 시나리오 였기 때문에 EntryPoint를 복구하기 위해 삽질을 해본다. 


우선, EntryPoint에 대해 복습을 해본다.


EntryPoint는 제어가 운영체제에서 컴퓨터 프로그램으로 이동하는 것이라고 위키백과에 적혀있는데 

쉽게 말하면 프로그램의 시작 지점이라고 생각하면 된다. 

메인함수가 아니라 런타임 라이브러리의 한 부분이다. 


엔트리포인트를 거쳐 쭉 내려가다 보면, 메인 함수를 만날 수 있다.


메인 함수에 접근하기 전 과정은 생략한다. 


난 오늘은 PE가 아닌 ELF에 대해 공부하기 위해 이 글을 쓰고 있다. 


이때까지 리버싱이나 포너블을 접할 때 ELF의 구조는 모르고 단순히 어셈블리로만 분석을 하다보니 이러한 문제를 만났을 때 멘탈이 한 10분 나가게 되는 것이다. 


제대로 공부 해두어야겠다고 생각했다.


우선 ELF 부터 알아보자. 


ELF는 Executable and Linkage Format 


실행 가능한 바이너리 또는 오브젝트 파일 등의 형식이 규정되어 있다.


ELF파일은 ELF 헤더가 맨 앞에 위치한다. PE와 같은 구조이다. 

그 다음 프로그램 헤더 테이블과 섹션 헤더 테이블이 위치하게 된다.


★ PE파일 또한 EXE, DLL, OCX 다 PE이듯이 ELF도 실행파일을 제외하고도 파일 시그니처가 같을 수 있음을 기억해야 한다.


오브젝트 파일 

1. 재배치가 가능한 파일 (relocatable file)

=> 코드와 데이터를 다른 오브젝트 파일과 링킹이 될 수 있게 한다.


2. 실행 파일 (executable file)

=> 코드와 데이터를 타겟 운영체제에서 실행 시킬 수 있도록 한다.


3. 공유 오브젝트 파일 (shared object file)

=> 재 할당 가능한 데이터를 정적 혹은 동적으로 다른 공유 오브젝트들과 공유할 수 있도록 한다.



실행파일의 구조는 다음과 같다.

 ELF header 

 Program header table

 Segment 1

 Segment 2

 Section header table optional


PE에게 PEVIEW가 있다면 ELF에게는 readelf라는 녀석이 있다.


SimpleVM 바이너리를 통해 확인하자.



지금 보면 EntryPoint가 0xC023DC라고 되어있다. 

SimpleVM 바이너리를 ida로 정적분석 하려고 할 때 이런 경고가 떴었다.



그렇다면, 지금 SimpleVM의 저자가 잘못 된 엔트리포인트를 세팅해두었다고 볼 수 있다. 


직접 하나 확인을 해보기로 했다. 

정상적인 ELF 파일을 이용해서 타겟은 ROOTME 바이너리 ! 



해당 바이너리의 엔트리 포인트를 0X12340000로 강제로 바꾸어본다.



이 부분이 ELF Header의 Magic 부분이다. 

자 어떻게 되는지 IDA로 열어본다.

SimpleVM과 동일한 경고가 떴다. 



이렇게 EntryPoint를 바꾸게 되면 프로그램의 시작지점을 올바르게 찾지 못하기 때문에 에러가 빰 뜨는 것을 확인할 수 있는 시간이었다.


그렇다면, SimpleVM에서 저자가 요구한 사항은 과연 무엇일까?


Entrypoint와 주소의 정확한 상관 관계를 원하지 않았을까  

일단 알아두어야 하는 것은 32bit 기반은 페이지가 4KB라는 것이다.



'0x02 Reverse Engineer > 0x02. Reversing.kr' 카테고리의 다른 글

공개용 CSharp Writeup  (0) 2018.06.04
CSharp  (0) 2018.06.04
SimpleVM  (0) 2018.06.01
잠시 잡담  (0) 2018.06.01
Lotto  (0) 2018.06.01