뉴비에욤

Manual Unpack (매뉴얼 언팩) - ESP Trick 본문

Reversing/이것 저것

Manual Unpack (매뉴얼 언팩) - ESP Trick

초보에욤 2015. 8. 26. 01:09

원본 링크 : http://www.websense.com/securitylabs/blog/blog.php?BlogID=176

그런데 링크가 죽었다...ㅠㅠ

 

 

 

악성코드 제작자들은 자신들의 바이너리(악성코드) 파일이 자동으로 언패킹 되는 것을 막기 위해 대부분 커스텀 패커나 프로텍터를 사용한다. 이는 안티바이러스의 탐지 기법 중 행위 분석을 위해 사용되는 시그니처가 생성되는것을 지연시킨다.

 

"Scramblers" 라고 불리는 도구들은 시그니처 기반의 안티 바이러스 탐지 기법을 우회 하기 위해 패킹된 바이너리를 파일을 변조하는 목적으로 개발되었다.

 

"MSLRH" 이라는 공개된 프로텍터는 바이너리 파일을 압축 할 뿐만 아니라 안티 디버그, 안티 덤프, "stolen-byte" 등의 기법까지 사용하면서 리버싱을 꽤 어렵게 만든다. 게다가 패킹된 바이너리가 어떤 패커로 패킹된건지 알아보니 "PEiD"와 같은 시그니처 기반 스캐너들을 사용을 막기 위해 꽤 재밌는 기능을 제공하는데, 바로 "PEiD" 등의 툴에 보여지는 패커 이름을 선택할 수 있게 해놓았다.

   ( "어떤 패커로 이 바이너리가 패킹되었다고 보여줄까요?"  )

 

* Stolen-Byte 란??

 

원리는 간단한데,  자동 언패커나  리버서들을 방애하기 위해 이전에 패커 사용자가 선택한 패커에서 사용하는 몇몇 바이트들을 바이너리 EP 부분에 삽입하게 된다. 사실 이런 종류의 툴은 악성코드 뿐만 아니라 상용 프로그램(윈도우 오피스, 한글, 게임 바이너리 등) 개발자들이 리버싱을 방해하기 위해 사용하기도 한다.

 

 

실제 아래 사진은 "MSLRH" 패커의 사진으로 사용자가 다양한 패커의 시그니쳐를 선택할 수 있다.


 인터넷에서 다양한 프로텍터, 패커, "Scramblers" 등의 도구들을 손쉽게 구할 수 있기 때문에 바이너리를 분석하는 것이 약간 어려울 수도 있다. 왜냐면 실제 악성코드들은 독단적으로 동작하던지 다른것과 연계해서 동작하던지 그 행위가 중요한데 대부분 이런 행위들이 패커 자체 보다는 더 흥미롭기 때문이다.  따라서 다양한 패커들에 사용될 수 있는 언패킹 기법을 알아두는 것이 좋은데 이러한 언패킹 방법을 "ESP Trick" 이라고 한다. "ESP Trick"은 많은 리버서들이 사용하는 방법이고 온라인에서 구할 수 있는 언패킹 스크립트인 다양한 "OllyScript" 에서 사용된다.

 

이 포스팅은 "ESP Trick" 방법과 어떻게 가능한지에 대해 설명한다.

 

 

 

ESP Traick

 

올리 디버거에서 패킹된 바이너리 파일을 열면 보통 아래 사진에서 보여지는 메시지 창이 나타난다.


 

대부분의 경우 패커와 프로텍터는위 사진처럼 Entry Point(이하 EP) 근처에 "PUSH" 명령어 (PUSH, PUSHAD 등)를 포함한다.

"PUSHAD" 명령어는 모든 레지스터(EAX,ECX 등)를 스택에 push 하기 위해 사용한다. 바로 이 부분 때문에 ESP Trick 이 가능해진다. "PUSHAD" 명령어의 목적은 언패킹 루틴 실행 이후 (원본 코드 혹은 쓰레기 코드)에 실행되는 명령어에서 현재 레지스터에 저장된 값을 사용할 수도 있으니, 언패킹 루틴에서 레지스터를 사용하기 위해 현재 레지스터 값들을 저장하는 일종의 백업과 같은 것이다.

언패킹 루틴이 종료되면 바이너리 파일의 모든 섹션들을 언팩 상태가 될것이고, 이 때 "POPAD" 명령을 통해 원래의 레지스터 값들을 스택으로 부터 다시 회수할 것이다.

 

결과적으로, 다음과 같은 작업을 통해 언팩된 바이너리를 얻을 수 있다.

 - PUSH 계열 명령어 실행 (ex:PUSHAD)

 - ESP 레지스터에 하드웨어 브레이크 포인트 설치 (이하 HW BP)

 - 실행

 - 이전에 설치한 HW BP 때문에 멈추는 곳을 확인

- OEP 처럼 보이지 않으면 프로그램이 다시 BP 주소에서 멈출 때 까지 실행

 

 

단계별로 설명하기 전에, 왜 ESP 레지스터에 HW BP를 설치해야 하는지에 대해 설명하겠다. ESP 레지스터는 다른 말로 스택 포인터라고도 한다. 스택 포인터는 항상 스택의 top 부분을 가리키는데, ESP 레지스터에 HW BP를 설치하는것으로 현재 스택에 저장된 원래 레지스터 값들이 언제 회수(POPAD) 되는지 알아 차릴 수 있기 때문이다.

 

HW BP를 설치하는것이 매우 중요한데 만약 일반적인 소프트웨어 브레이크 포인트(이하 SW BP)를 설치해 보리면 INT3 인터럽트 명령어가 해당 주소에 설치되고, 이는 코드가 변형되는 결과로 이어지게 된다.


대부분의 경우 패커와 프로텍터는위 사진처럼 Entry Point(이하 EP) 근처에 "PUSH" 명령어 (PUSH, PUSHAD 등)를 포함한다.

"PUSHAD" 명령어는 모든 레지스터(EAX,ECX 등)를 스택에 push 하기 위해 사용한다. 바로 이 부분 때문에 ESP Trick 이 가능해진다. "PUSHAD" 명령어의 목적은 언패킹 루틴 실행 이후 (원본 코드 혹은 쓰레기 코드)에 실행되는 명령어에서 현재 레지스터에 저장된 값을 사용할 수도 있으니, 언패킹 루틴에서 레지스터를 사용하기 위해 현재 레지스터 값들을 저장하는 일종의 백업과 같은 것이다.

언패킹 루틴이 종료되면 바이너리 파일의 모든 섹션들을 언팩 상태가 될것이고, 이 때 "POPAD" 명령을 통해 원래의 레지스터 값들을 스택으로 부터 다시 회수할 것이다.

 

결과적으로, 다음과 같은 작업을 통해 언팩된 바이너리를 얻을 수 있다.

 - PUSH 계열 명령어 실행 (ex:PUSHAD)

 - ESP 레지스터에 하드웨어 브레이크 포인트 설치 (이하 HW BP)

 - 실행

 - 이전에 설치한 HW BP 때문에 멈추는 곳을 확인

- OEP 처럼 보이지 않으면 프로그램이 다시 BP 주소에서 멈출 때 까지 실행

 

 

단계별로 설명하기 전에, 왜 ESP 레지스터에 HW BP를 설치해야 하는지에 대해 설명하겠다. ESP 레지스터는 다른 말로 스택 포인터라고도 한다. 스택 포인터는 항상 스택의 top 부분을 가리키는데, ESP 레지스터에 HW BP를 설치하는것으로 현재 스택에 저장된 원래 레지스터 값들이 언제 회수(POPAD) 되는지 알아 차릴 수 있기 때문이다.

 

HW BP를 설치하는것이 매우 중요한데 만약 일반적인 소프트웨어 브레이크 포인트(이하 SW BP)를 설치해 보리면 INT3 인터럽트 명령어가 해당 주소에 설치되고, 이는 코드가 변형되는 결과로 이어지게 된다.


지금부터 예제를 들기 위해서 아래와 같은 이유로 인해 UPX 패커로 패킹 된 "calc.exe" (계산기) 바이너리를 이용한다.

 - UPX 패커는 상용 프로그램이 아니다.

 - 효율성(사이즈 축소)이 꽤 괜찮기 때문에 악성 코드 뿐만 아니라 일반 프로그램에서도 자주 사용된다.

 - 계산기 바이너리는 윈도우 OS 에서 손쉽게 찾을 수 있기 때문에, 아래의 예제를 따라할 수 있다.

 


UPX 패커는 아래의 사진처럼 실행 압축을 수행하는 바이너리에서 수행할 수 있는 "압축 해제" 기능(-d 옵션)을 제공하기 때문에 인터넷에서 구할 수 있는 몇몇의 "Scramblers" 프로그램들은 UPX 패커로 패킹 된 바이너리가 압축 해제(언팩) 되지 않게 바이너리를 변경시킨다. 바이너리를 변경 시킨 경우 자동 언패킹(UPX 언팩 옵션) 도구들은 제대로 동작하지 않을 것이다. 따라서 "ESP Trick"은 꽤 유용한 방법이 될 수 있다.


 

 

 

 

"ESP Trick" 사용 방법

 

시작하기 위해 우선 "PUSHAD" 명령을 실행하고, ESP 레지스터 값을 우측 클릭 하여 "Follow In Dump" 메뉴를 클릭한다.


 

 

좌측 하단의 "Dump Window" 메뉴에서 첫 dword 바이트 (ESP 값)을 선택하고 HW BP - On Access 를 설치한다.


 

 

실행(F9)을 하면 아래 사진처럼 BP가 설치된 조건에 의해 어떤 주소에 멈추게 된다.


 

잘 보면 이전에 설명했던 것처럼 "POPAD" 명령이 사용되었다. 그 다음 "JMP" 명령어는 OEP로 이동되서, 리버서가 프로세스를 분석하거나 덤프 할 수 있게 해준다.


'Reversing > 이것 저것' 카테고리의 다른 글

Anti VM 우회 기법  (0) 2016.03.20
IDA Pro User Tutorial 번역본 (설명서/튜토리얼)  (0) 2016.02.16
Comments