NOTICE

[Unpack] FSG v2.0 -> bart/xt _비공개

Date : 2015.02.16 00:14 Category :


 FSG v2.0으로 실행 압축된 파일의 Unpacking 방법에 대해 알아봅시다. 이론적인 설명은 배재하고 압축 해제 방법만 간단히 소개하도록 하겠습니다. 분석에 사용한 샘플 파일과 분석 도구 정보는 다음과 같습니다.


 - 샘플 파일 정보

 파일 이름

 TEST.exe

 파일 크기

 21,497 byte

 MD5

 2239A76E8298387FBAA93700800E9CC0


 - 분석 Tool 정보

 파일 이름

파일 이름

OllyDBG.exe

 PEiD.exe

Import REC 1.7c.exe

 



1. 실행 압축 확인

 가장 먼저 해야 할 일은 샘플 파일의 실행 압축 여부를 확인하는 것입니다. PEiD.exe를 사용해 TEST.exe 파일의 실행 압축을 확인해보면 [그림 1.1.]과 같습니다.


[그림 1.1.] 실행 압축 확인



2. 압축 해제하기

 TEST.exe는 FSG v2.0 -> bart/xt로 실행 압축 되어 있습니다. 이것을 OllyDBG.exe로 풀어보겠습니다. 해당 샘플을 디버거에 올리면 'XCHG DWORD PTR DS:[42D1BC], ESP'와 같은 코드를 확인 할 수 있습니다.


[그림 2.1.] TEST.exe 시작 코드


 EAX에 들어가는 주소 값, 즉 0x1001E4D7로 이동해 BreakPoint를 설치하고 실행(F9)하면 해당 주소에서 멈춥니다.


[그림 2.2.] 0x1001E4D7 주소로 이동


 그리고 조금 내려가다보면 첫 번째 JUMP 문을 확인 할 수 있습니다. 이 곳까지 왔다면 F7이나 F8을 사용해 JUMP하는 주소(0x1001E3C0)로 이동합니다.


[그림 2.3.] 첫 번째 JUMP 코드 확인


 0x1001E3C0에서 조금 더 내려가다보면 [그림 2.4.]와 같은 세 번째 JUMP 코드가 나타납니다. 여기서 EAX 레지스터에 저장되어 있는 값이 OEP 주소 입니다.


[그림 2.4.] 세 번째 JUMP 코드 확인


 실제 EAX에 들어있는 주소(0x10016EF1)로 이동해보면 OEP를 확인 할 수 있습니다.


[그림 2.5.] OEP 확인 및 덤프 파일 생성 준비


 압축 해제가 완료되고 OEP를 찾았다면 Plugin을 사용해 덤프 파일을 생성합니다. 단 OllyDBG는 IAT를 완벽하게 복구하지 못하기 때문에 Rebuild Import 체크박스를 해제합니다. 


[그림 2.6.] 덤프 파일 생성


 IAT는  Import REC 1.7c.exe Tool을 사용해 복구하도록 합니다. 타깃 프로세스(압축 해제 중인 프로세스)를 선택하고 OEP를 입력한 뒤 Get Imports를 선택해 IAT 정보를 수집합니다.


[그림 2.7.] IAT 복구


 마지막으로 Fix Dump를 선택해 OllyDBG.exe로 만든 덤프 파일에 덮어쓰면 압축 해제 과정이 끝납니다.


[그림 2.8.] 파일 압축 해제 완료


 이상으로 'PECompact 2.xx --> BitSum Technologies [Overlay] *' 압축 해제 과정 포스트를 마치겠습니다.





[그림 02] Sample File FSG Packing 확인

 

Packing 후 해당 파일의 PE 구조가 어떻게 되는지 살펴본다.

[그림 03] FSG Packing File Pe 구조

 

여기서 FSG v2.0 실행압축 방식의 특징을 살펴보면 다음과 같다.

 1 섹션의 이름이 없다.

2 Dos Header NT Header를 겹쳐쓴다.

3 압축 해제 코드가 NULL 영역에 존재한다.

4 압축된 Data Section2에 존재하고 압축해제를 하는 과정에서 Section1에 작성한다.

 

2. FSG v2.0 Unpacking

 이와 같은 정보를 토대로 OllyDBG 110을 사용해 Unpackig과정을 수행한다. Unpacking 과정에서 가장 중요한 것은 OEP를 찾는 것이다. Packing 된 파일을 OllyDBG에 로드한다.

 

[그림 04] FSG Packing 파일 EP

 

FSG 방식으로 Packing된 파일은 위와 같은 메시지가 출력되고 [그림 04]와 같이 코드가 시작된다.

[그림 05] 압축해제 코드

 

OllyDBG Packing된 프로그램을 Load한 뒤에 Step Over로 계속해서 진행시켜보면 [그림 05]와 같이 ESI 레지스터가 가리키는 Byte EDI가 가리키는 주소로 복사되는 것을 알 수 있다. 원본 코드를 특정 영역에 압축해제 하는 것으로 추측할 수 있고 쓰여지는 메모리에 OEP가 있을 것으로 예상된다.

[그림 06] 압축해제 코드

 

계속 Tracing하면 [그림 06]과 같은 부분을 만나게 된다. STOS 구문에 의하여 EAX의 값을 EDI가 가리키는 메모리에 저장한다. 또한 4001D1주소에서 특정 메모리주소로 분기하는 구문이 있다.

 

[그림 07] IAT 복구

 

어느 정도 루프가 진행된 후에 EDI가 가리키는 주소로 이동해 보면 [그림 07]과 같이 IAT가 복구되고 있는 것을 확인할 수 있다.

[그림 08] Sample File OEP

 

이후 4001D1 주소에 있는 JMP 구문에 의해 특정 주소 영역으로 분기하게 된다. 해당 영역으로 이동하여 Analysis Code를 하면 OEP로 보이는 부분을 확인 할 수 있다.

모든 코드가 Unpacking되었기 때문에 OllyDBG를 사용하여 Dump를 생성한다.

[그림 09] Sample File Dump

 

FSG 2.0에 대해서는 OlllyDBGIAT를 복구해주지 못하므로 Rebuild Import를 선택하지 않고 Dump 한다.

 

3. IAT 복구

IAT를 복구하기 위해 Import REConstructor를 사용한다. Attach to an Active Process에서 Olly DBG Load한 프로그램을 찾아 선택한다.

[그림 10] IAT 복구 작업

 

IAT를 복구하기 위해서는 IAT Infos Needed에 필요한 정보를 입력해야 한다. 필요한 정보는 다음과 같다.

- OEP(RVA) / Import Table RVA / Import Table Size

Import Table RVAImport Table Size [그림 07]에서 주소 값과 Size를 계산하여 입력한다. 로드되는 DLL 별로 나누어 계산해야 한다. 모든 과정이 끝나고 Fix Dump를 선택해 Dump 파일에 넣으면 Upacking 과정이 끝난다.