IAT복구작업에서 가장 많이 이용되는 툴이 ImportREC 일것이다. 클릭 한방으로 대번 복구를 시켜주니 편하기 그지없다. 그러나 이런 편리한 녀석이 종종 복구를 못하는 경우가 있다. 가장 흔하면서 이해하기 쉬운 예는 다음 내용과 같다.
==================================================================
ImportREC가 자동으로 IAT복구를 못하는 경우를 몇가지 살펴보겠습니다. 대상 패커는 UPX이지만 기존 UPX와는 다른 약간 변형된 UPX라고 보면 되겠습니다.
먼저 UPX도 위에서 설명한 스택기반의 패커이기 때문에 AsPack과 같은 방법으로 MUP를 진행 하면서 ImportREC를 이용하여 IAT 복구까지 마친 상태라고 가정 하겠습니다. 파일을 실행해보면 에러메시지가 뜨면서 실행이 안됩니다.
평범한 UPX라면 아주 쉽게 MUP완료 후 정상적으로 실행이 될 텐데 뭐가 잘못 되었기에 에러가 발생하는 걸까요? 그 이유는 IAT가 제대로 복구가 안되었기 때문입니다. ImportREC가 찾아낸 IAT의 RVA와 Size는 각각 25190, CC입니다.
실제로 그러한지 디버거로 직접 확인작업을 해보겠습니다. OEP에 진입시점에서 보면 첫 번째 보이는 Call 명령에서 덤프창에 덤프를 해보면(Follow in dump > Memory Address) IAT의 함수들이 보여지게 되는데 시작주소가 425190(RVA 25190)입니다. ImportREC가 찾아낸 값과 같습니다. 그렇다면 IAT의 RVA값은 정상이 되겠습니다.
이번엔 IAT의 사이즈를 확인해봐야 하는데 ImportREC의 계산대로라면 IAT의 끝의 주소는 42525C가 되겠습니다. 아래 그림을 보더라고 얼핏 보면 CloseHandle()를 마지막으로 IAT가 끝난 것 같아 보입니다.
연속된 IAT의 함수의 끝
ImportREC는 미쳐 분리되어있는 함수들은 찾지 못한 것입니다. 이 함수들도 포함하여 다시 IAT의 Size를 계산해보면 12C(4252BC-425190)입니다. 즉, IAT의 정상적인 Size는 12C입니다.
이제 직접 ImportREC에게 사이즈를 가르쳐주어 인식을 하게 만들어줍니다. 이제 정상적으로 IAT가 복구 되어 파일은 정상 실행하게 됩니다.
이번에는 Orien이라는 패커로 예를 들어 조금 다른 상황을 살펴보겠습니다. Orien의 OEP를 찾는 과정은 그리 어렵지 않습니다. 우리가 알고 있는 방법과 트레이싱 몇번만으로 OEP로 도달 할 수 있는 비교적 쉬운 녀석입니다. 따라서 OEP를 찾아 냈고, 이미지 덤프 작업까지 마친 상황이라 가정하고, IAT복구 하는 과정부터 살펴보도록 하겠습니다.
ImportREC를 이용하여 IAT 복구를 시도 했더니 아래와 같이 IAT의 정상적인 함수를 찾아내지 못하는 상황이 발생하는 것을 확인할 수 있습니다.
ImportREC의 기능을 이용한 Disasm
위 그림에서 찾아내지 못한 첫번째함수의 RVA가 60984입니다. 다시 디버거로 돌아가서 RVA 60984에서 어떤 일이 발생하는지 확인해 보겠습니다. 메모리 덤프창에서460984(ImageBase (400000)+RVA(60984))에 쓰기가 시작되는 시점을 잡아내기 위하여 아래와 같이 브레이크포인트를 잡아줍니다. 그리고 Run을 하여 상황을 살펴보도록 하죠.
브레이크 포인트두번째 찾아내지 못한 함수 역시 같은 방법으로 확인해 보면 ExitProcess함수 라는 것을 확인할 수 있고, 이를 역시 ImportREC를 이용하여 등록시켜 주고, 덤프파일의 IAT를 복구 시켜 줌으로서 작업을 완료하게 되고, 이제 파일은 정상 실행 될 것입니다.
이밖에도 ImportREC가 IAT를 복구해내지 못하는 상황에서 ImportREC를 이용하여 IAT를 복구시켜주는 방법은 몇몇 가지가 더 있습니다.
출처 : slaxcore.tistory.com
'Reverse Engineering > Unpacking' 카테고리의 다른 글
| Themida 2.0.1.0 MUP (0) | 2008/11/07 |
|---|---|
| ImportREC가 자동으로 IAT 복구를 못해줄때. (3) | 2008/09/27 |
| Yoda's Crypter 1.3 Unpacking (0) | 2008/09/10 |
| Themida Unpacking 1.9.1.0 (4) | 2008/08/29 |
