티스토리 뷰

리버싱/정리

[ASPACK Unpacking]MUP

1q 2015. 7. 29. 12:44

ASPACK의 언패킹에 대해서 정리를 하겠습니다.


suspect.exe파일을 Exeinfo PE로 보면 Aspack v2.0 으로 패킹이 되어있는 것을 확인 가능합니다.



ASPACK을 언패킹하는 것은 2가지 방법이 있습니다. 더 있을수도 있지만 제가 아는 2가지를 소개하겠습니다. 첫 번째는 Hardware breakpoint를 이용해서 푸는 방법이 있고, RETN 0C를 찾아서 BP를 걸어 실행 후 OEP로 가는 방법입니다. 속도면으로는 후자가 좋습니다.


디버거를 이용해서 해당파일을 로딩하면 첫 구문에서 PUSHAD를 볼 수가 있습니다. PUSHAD 명령어는 범용레지스터들에 저장된 값들을 스택에 저장하는 명령이 입니다. 패킹되어 있는 대부분의 파일이 첫 구문에서 PUSHAD를 볼 수 있습니다. 현재 레지스터 값을 스택에 저장하고, 원본코드를 특정 메모리상에 복구 시킨다음 POPAD를 이용해서 원래의 레지스터값을 복구하여 사용하기 위해 사용하는 것입니다.


정리를 해보자면 아래와 같습니다. 

PUSHAD 명령어로 현재 레지스터 스택에 저장 

원본 코드 특정 메모리 상에 복구 

POPAD로 레지스터 복구 

OEP로 분기 


이제 언패킹을 시작해보겠습니다. 일단 PUSHAD를 트레이싱 하고 현재 레지스터를 스택에 저장하는 부분을 보겠습니다.


레지스터를 보시면 EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI를 스택에 넣어줍니다.


스택을 보시면 PUSHAD명령어로 인해서 스택에 순서대로 들어가 있습니다.


ESP를 보면 현재 레지스터에 저장되어 있는 값들이 차례대로 저장이 되어 있습니다. ESP부분을 Dump해서 보겠습니다.


12FFA4(ESP) 부분에 차례대로 저장이 되어있는 것을 볼 수가 있습니다.


위의 진행대로라면 원본코드를 메모리 상에 복구하고 레지스터 복구를 위해서 현재 ESP가 가리키는 메모리 주소에 접근할 것입니다. 따라서 ESP가 가리키는 곳에 BP를 설정합니다. 4바이트만큼 28 02 94 7C 를 잡아서 Breadpoint -> Hardware, onaccess -> Dword를 통해서 걸어줍니다.


Hardware BP 확인 방법은 Debug->Hardware breadpoints를 눌러주면 확인이 가능합니다.


0012FFA4(ESP) 에 4바이트만큼 걸려있는 것을 확인 가능합니다.


위의 상태에서 F9를 눌러보면 아래의 루틴으로 이동합니다. 아래의 코드에서 RETN 명령어는 JMP 구문과 동일하기 작동합니다. JNZ를 타고 004564FC를 지나서 RETN을 하면 00445834로 RETN합니다. 바로 이 곳이 OEP입니다. 


RETN을 통해 해당 주소로 왔더니 뭔가 꼬여있네요. OEP를 찾았으니 이제 OllyDump 플러그인을 이용해서 덤프를 떠보겠습니다.


노란색 줄에 OEP를 정확히 입력하고, 아래 빨간색 네모박스 부분을 체크해제 합니다. 중국산이라서 알아들을 수가 없네요. 영어로는 Rebuild import 입니다. 체크해제를 하는 이유는 여기서 하는 것보다 IMPORT REC라는 툴을 이용해서 잡아주는 것이 효과가 좋습니다.


덤프를 하고 Exeinfo를 통해 봤더니, 패킹이 풀려있고, Delphi로 작성이 되어 있는 것을 볼 수가 있습니다.


해당 파일을 열어본 결과 아까 위에서 Rebuild를 체크해제 했기 때문에 IAT가 엉켜 있습니다.


ImportREC 툴을 이용해서 IAT를 복구를 하겠습니다. 



해당 툴을 열어보면 1번 부분에 IAT AutoSearch로 일단, 해당 파일의 IAT를 검색합니다. 화면에 YES가 나오면 올바르게 table을 가져온 것입니다. 검색하고 2번 Get Imports를 통해서 Import를 가져옵니다. 그리고 3번을 통해 Dump를 해주면 MAP가 완료가 됩니다.


덤프된 파일을 열어보면 깔끔하게 00445834 OEP가 보이는 것을 확인 가능합니다. 여기까지가 PUSHAD를 통해서 byte에 BP를 걸어서 MUP한 과정이였습니다.


2번째 방법을 정리하겠습니다. 아까 위에서도 봤듯이 RETN은 JMP 기능을 합니다. 그렇기 때문에 RETN 0C부분을 찾으면 그 아래부분에 OEP로 가능 RETN이 분명히 있을 겁니다. 검색을 통해 RETN 0C를 찾겠습니다.


RETN 0C가 존재합니다.


아래 PUSH와 RETN에 BP를 걸고 F9를 눌러줍니다.


PUSH 0 부분이 OEP부분으로 바뀌었고, OEP부분으로 갈 수가 있습니다.


몇 번 해보다면 아주 간단한 ASPACK 언패킹이였습니다. 패킹의 종류는 엄청 많습니다. 다음에는 난이도가 높은 Themida 언패킹을 정리해보도록 하겠습니다.

'리버싱 > 정리' 카테고리의 다른 글

[코드인젝션]기본 뼈대  (0) 2015.08.11
[Cheat Engine] 사용법  (6) 2015.08.11
.NET Reflector에 reflexil 추가 하기  (0) 2015.07.03
.net 프로그램 리버싱툴  (0) 2015.07.02
reversing jump 명령어  (0) 2015.07.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함