NOTICE


 EXECryptor 2.2.4 -> Strongbit/SoftComplete Development (h1) *로 실행 압축된 파일의 Unpacking 방법에 대해 알아보겠습니다. 이론적인 설명은 배재하고 압축 해제 방법만 간단히 소개하도록 하겠습니다. 분석에 사용한 샘플 파일과 분석 도구 정보는 다음과 같습니다.


 - 샘플 파일 정보

 파일 이름

 Program.exe

 파일 크기

 28,672 byte

 MD5

 5C69C21C7C1BA3F0256BEC6748B4CD22


 - 분석 Tool 정보

 파일 이름

파일 이름

OllyDBG.exe

 PEiD.exe



1. 실행 압축 확인

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


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



2. 압축 해제하기

 Program.exe은 EXECryptor로 실행 압축되어 있습니다. 이것을 OllyDBG.exe로 풀어보겠습니다. 먼저 디버거에 몇가지 설정을 해야합니다. "Options → Debugging options"의 Exceptions 탭에서 아래 [그림 2.1.]과 같이 설정합니다.


[그림 2.1.] OllyDBG.exe Exceptions 설정


 그리고 Olly Advanced Plugin을 사용해 TLS Callback 함수에 Break를 겁니다. 


[그림 2.2.] Break on TLS Callback 설정


 Program.exe를 OllyDBG.exe에 올리면 다음과 같은 코드를 확인할 수 있습니다.


[그림 2.3.] Program.exe 시작 코드


 여기서 'Alt + B'를 사용해 BreakPoint 창을 열고 0x0043F659 주소에 BreakPoint가 설정되어 있는 것을 제거합니다.


[그림 2.3.] BreakPoint 설정 제거


 Program.exe의 .text 영역에 Access Break Point를 설정하고 'F9'를 눌러서 실행시키면 .text 영역에 접근하는 순간 실행이 멈출 것입니다.


[그림 2.4.] Program.exe의 .text 영역에 Access BreakPoint 설정하기


 Unpacking은 압축된 데이터의 압축 해제, 압축 해제된 데이터 쓰기, IAT 복원의 과정을 거쳐 OEP로 이동합니다. 앞선 Access Break Point 설정으로 Program.exe가 .text 섹션에 압축 해제된 데이터를 쓰는 순간 멈추게 됩니다. 0x0043D641에서 EDI는 .text 섹션의 주소입니다.


[그림 2.5.] .text 섹션에 압축 해제된 데이터 쓰기


 JUMP 문을 사용해서 압축 해제된 코드를 모두 쓸 때까지 반복한 뒤 복원이 완료되면 아래 [그림 2.6.]과 같이 0x0043D648 주소에서 멈춥니다. 'Shift + F9'를 사용해서 몇 번 더 반복합니다.


[그림 2.6.] 압축 데이터 해제 완료


 .text 영역으로 이동해보면 복원된 데이터를 확인할 수 있습니다.


[그림 2.7.] 복원 데이터 확인 및 API 검색


 'Search for → All intermodular calls'로 .text 영역에서 사용하는 함수 정보를 확인합니다. 아직 IAT 복구가 이루어지 않았기 때문에 명시적인 함수 이름을 확인할 수는 없습니다.


[그림 2.8.] API 검색 결과 확인


 [그림 2.8.]에서 IAT 위치만 확인하고 해당 주소로 이동한 뒤 적절한 곳에 BreakPoint 설치합니다. Program.exe를 계속 실행하면 IAT가 복원되다가 BreakPoint에서 멈출 것입니다.


[그림 2.9.] IAT 복원 확인


  IAT 복원이 모두 끝나면 Program.exe에서 사용하는 모든 함수 정보를 알 수 있습니다. 


[그림 2.10.] IAT 복원 완료 확인


 우리는 OEP를 찾는 것이 목적입니다. PE 파일은 메인 함수로 진입하기 전에 Stub Code를 거치게 됩니다. 그리고 Stub Code에는 GetVersion( ), GetCommandLine( )과 같이 Default로 사용되는 함수들이 있습니다. 우리는 이점을 이용해서 OEP를 찾아 보겠습니다.

 다시 'Search for → All intermodular calls'를 사용해 API를 검색합니다. 앞서 언급했던 함수를 찾아서 BreakPoint를 설치합니다. VMware를 사용하시는 분은 미리 Snapshot을 생성해 놓으시기 바랍니다.


[그림 2.11.] Stub Code에서 사용하는 함수에 BreakPoint 설치


 'F9'를 사용해 실행시키면 아래 그림과 같이 Stub Code에서 동작이 멈춥니다. Stub Code의 시작 지점이 0x00401130이고 여기가 OEP라는 것이 확인되었습니다.


[그림 2.12.] Program.exe의 OEP 확인

 

 스냅샷으로 돌아가서 0x00401130에 BreakPoint를 설정하고 다시 실행합니다. 실행 코드는 Program.exe의 OEP에서 멈출 것 입니다. 여기에서 OllyDump로 덤프 파일을 생성하면 모든 Unpacking 과정이 완료됩니다.


[그림 2.13.] OllyDump를 사용해 덤프 파일 생성


[그림 2.14.] OllyDump를 사용해 덤프 파일 생성


 이상으로 '[Unpack] ASPack 2.12 -> Alexey Solodovnikov' 압축 해제 과정 포스트를 마치겠습니다.