본문 바로가기

CAT-Security/미분류

AsPack MUP 정리


패커와 프로텍터의 차이점

 

패커

패커란 실행 파일 압축기를 말 한다. 정확한 명칭은 Run_Time 패커라고 한다. ‘실행 압축이란 실행 파일에 실행 코드를 원본 형태로 두지 않고 압축을 한 것 이다. 그리고 압축해제 코드를 실행 파일에 같이 넣어 놓은 것 이다. 그래서 프로그램이 실행 될 때 먼저 압축해제 코드를 만나 원본 실행 코드 압축이 풀린 뒤 실행이 된다. 이러한 실행 압축을 만드는 것을 패킹이라고 한다

패커의 사용 목적은 다음과 같다.


1.     실행 파일을 줄이고자 하는 목적

2.     PE 파일 내부의 코드와 소스를 감추기 위한 목적

 

 

프로텍터

프로텍터란 PE 파일(실행파일)을 리버싱으로부터 보호 하기 위한 프로그램 이다. 패커 처럼 실행 압축 할 뿐만 아니라 리버싱을 막기 위한 기법들이 추가 된다.

 

프로텍터의 사용 목적은 다음과 같다.

1.     크래킹 방지

2.     코드 및 리소스 방지

 

두 가지의 큰 차이점은 패커는 말 그대로 압축만을 할 뿐이고 프로텍터는 프로그램을 보호하기 위한 기법이 들어 간 것이다. 디버거를 종료 시킨다던지 불가능하게 한다 던지의 기법 등이 있다.


 

1.  PEID 확인


<PEID로 확인>


PEID Aspack으로 실행 압축 된 파일을 확인 해 봤을 때 이다. Aspack으로 실행 압축 되어있다라고 나오며 EP.aspack으로 시작 함을 알수 있다.

 


<메모리 주소 확인>


Aspack에서 맨 처음 살펴볼 두 곳 이다. 시작부분이 PUSHAD로 되어있어서 프로그램시작시의 레지스터들을 모두 스택에 저장 한다는 부분과 .Reloc .adata 사이에 .aspack이 위치 한다는 부분을 확인 할 수 있다. 주소값을 살펴보면은 .aspack의 주소값부터 시작됨을 확인 할 수 있다.

packing의 매커니즘은 간단하게 설명해서 압축 된 파일들을 해제하는 부분부터 시작하게 된다. .aspack의 주소부터 시작하는 이유는 압축 된 파일들을 해제 하기 위해서 이다. 압축 해제가 모두 되고 최종적으로 원래의 OEP로 가게 되어 실행 하게 되는 것 이다.

[압축해제루틴부터 시작] -> [압축해제 완료] -> [정상적인 프로그램 시작] 이 순인 것 이다.

즉 하드에서 존재하는 패킹된 파일의 크기가 1M가 이더라도, 압축이 풀려서 메모리에 올라 갈 때는 정상적인 크기로 올라가게 된다.



 

2.  Find OEP

<PUSHAD 후의 스택>


맨 처음에 있는 PUSHAD가 실행되고 난 이후의 레지스터와 스택 이다. 여기서 중요한 부분은 ESP 이다. 패킹이 모두 풀리고 난 후에 정상적으로 실행 될 레지스터를 저장 했기 때문에 패킹이 모두 끝나고 POPAD라는 명령어로 레지스터를 돌려받게 된다. 그렇기 때문에 스택에 저장된 ESP에 브레이크 포인터를 걸어 놓는다면 패킹이 모두 풀리고 정상적인 프로그램 시작 전으로 갈 수 있게 된다.


 

 

<EBPbreak point>


다음과 같이 esp의 주소에 직접적으로 브레이크 포인트를 걸어준다.



<POPAD 이후>


이렇게 POPAD 이후로 바로 오게 된다. 이 부분이 바로 실행 압축된 모든 압축을 풀고 정상적인 OEP로 돌아 가기 전에 POPAD로 레지스터를 돌려 받는 부분이다. 이 다음의 RETN 부분부터가 실제 프로그램이 실행 되는 부분이다.



<실제 프로그램 OEP>


다음으로 넘어오게 된다면 코드가 제대로 보이지 않아서 이런 식으로 보이게 된다. 컨트롤+A를 눌러주면은 코드가 제대로 정렬하게 된다.



<실제 프로그램 OEP>


다음과 같이 온전히 패킹이 풀리게 되었다.



<Dump>


이 상태로 덤프를 해주면 된다. Ollydbg의 기본기능이 아니라 Plugins의 기능 중 하나이기 때문에 플러그인을 따로 설정 해주어야 한다.



<Dump OEP 설정>


덤프로 바꿔줄 때 중요한 부분은 바로 OEP를 바꿔주는 부분이다. Start address base point로 해주고, Entry Point를 프로그램의 시작주소 – Base Point로 해주어야 한다. 또한 Rebuild import의 경우 ollydbg IAT를 재 배치해주는 옵션인데 많이 안정화가 되었다고 하지만 다른 툴을 돌려 복구 하도록 해보겠다.

 

 

 

 

 

 

 

 

3.  MUP

[alal은 패킹파일, AlZip_은 덤프파일]


이렇게 덤프파일로 저장을 하게 되면은, 패킹이 풀린 이후로 저장이 되기 때문에 압축이 풀린다. 즉 파일의 크기가 늘어난 것을 볼 수 있다.

이렇게 덤프로 파일을 만들어줄경우 정상적인 PE파일이지 못한다. 그래서 위에 보는 바와 같이 에러를 내게 된다. IAT가 엉망이기 때문이다. IAT를 제대로 설정해줘야 한다. 그때 사용 하는 툴이 바로 Import REConstructor이다.



<Import REConstructor>


툴의 사용 방법은 다음과 같다.

1.     Pick DLL 옆에 있는 박스에 ollydbg로 실행한 패킹된 원본파일(디버깅중인)Attach를 해준다.

2.     빨간 풍선 1번의 OEP값을 덤프 파일의 Entry Point의 값으로 해 준다.

3.     그 뒤 빨간 풍선 2번을 눌러주면 자동으로 RVA Size를 설정 해 준다.

4.     그리고 빨간 풍선 3번을 눌러주면 자동으로 IAT를 검색해 준다.

5.     그리고 마지막으로 Fix Dump로 덤프 파일에 덮어쓰기를 해주면 된다.

이렇게 해주면 패킹된 파일의 있던 IAT들을 덤프파일에 덮어 쓰게 되고, 덤프파일은 정상적인 실행 프로그램으로 재 탄생 되게 된다.(언패킹완료)



<OEP 설정 후>


AutoSerch를 해주었을 때의 스크린샷 이다. 자동으로 RVA Size가 잡히는 것을 볼 수 있다.



<Import 된 함수들>


dll들과 그에 사용되는 함수들이 출력됨을 확인 할 수 있다.

 



<덤프파일에 덮어쓰기>


그 뒤 덤프파일에 덮어 쓰기 해주면 된다.



<정상실행 화면>


정상적으로 실행 됨을 확인 할 수 있다.

'CAT-Security > 미분류' 카테고리의 다른 글

MBR (Master Boot Record) 정리  (0) 2013.07.22
ASProtect 2.1 MUP 정리  (1) 2013.06.18
[api]모달과 모달리스의 차이  (0) 2013.03.25
Callback(콜백 함수) 정리  (0) 2013.01.17
Code injection (1) - Basic  (2) 2013.01.02