본문 바로가기
Reversing/Reversing

upx 언패킹하기 - MUP(Manual UnPacking)

by bbolmin 2012. 7. 12.

upx로 패킹된 프로그램을 MUP로 upacking하는 방법을 알아보겠습니다.

 

예제 프로그램은 CodeEngn Basic 6번 문제로 하겠습니다.

파일 : Reverse_L06.exe

 

실행 화면은 아래와 같습니다.

 

peid와 stud_pe로 패킹되어 있는지 확인해보면 UPX로 패킹된 것을 볼 수 있습니다.

 

                                - peid -                                                                             - stud pe-

 

위와 같은 툴 없이도 올리디버거로 확인해 볼 수 있습니다.

올리디버거를 열면 "Compressed code?"라는 메시지를 띄어줍니다. 이걸로 패킹에 대한 의심을 해볼 수 있습니다.

 

 

                                            .....

 

그리고 코드 부분을 보면  위쪽에 pushad, 아래쪽에 popad와 jmp를 볼 수 있습니다. pushad가 있다면 패킹된 것으로 보면 됩니다.

패킹되어있더라도 프로그램을 실행하면 정상동작하기 위해 패킹을 풀어야 하므로 저 부분을 패킹을 푸는 알고리즘이라 생각하면 될 것 같습니다. (pushad로 이전 레지스터 상태를 스택에 저장해놓고 패킹을 푼후에 popad로 레지스터 상태를 복구해주는 것 입니다.)

그리고 jmp Reverse .00401360부분으로 가면 OEP(Original Entry Point)가 나옵니다.


 

이제 패킹된 것을 확인하였으니 언패킹을 해보도록 하겠습니다.

 

1. 먼저 MUP(Manual UnPacking)가 아닌 upx.exe툴을 이용하여 쉽게 언패킹할 수 있습니다.

 

upx307w.zip

usage : upx -d 패킹된 파일

 

언패킹 후 peid로 확인하면 upx패킹이 풀린것을 볼 수 있습니다.

 

 

2. 이번엔 Manual UnPacking으로 직접 올리디버거의 dump를 이용해서 해보겠습니다.

 

 

 올리디버거를 열어서 아까 봤던 마지막의 jmp코드까지 실행하고 00401360영역으로 가봅니다. (처음에 00401360주소(OEP)에 가보면 실제 코드를 볼수 없습니다. 아직 언패킹 알고리즘이 수행되지 않았기 때문입니다. 따라서 언패킹하는 알고리즘을 수행 후 00401360으로 가면 되겠습니다.)

 

그럼 실제 실행될 코드들이 나타납니다. 여기서 ollydump 플러그인을 이용해서 dump를 뜹니다.

 

OllyDump.dll<- download

Dump debugged process를 열어서 그냥 Dump만 해주면 됩니다. 그럼 upx패킹이 풀린 실행 파일을 얻을 수 있습니다.

위에서 Rebuild import에 체크가 되어야 IAT정보가 정확하게 복구되어 정상 실행 됩니다. 구버전 에서는 안정화 되지 않아서 Rebuild import를 해제하고 덤프 후 따로 ImportREC나 LoadPE 같은 툴로 IAT를 복구한다고 합니다.

ImportREC 1.7c.zip<-- IAT복구 툴

 

마지막으로 복구한 파일을 peid로 확인해보면 정상적으로 패킹이 풀린 것을 확인할 수 있습니다.

 

 

'Reversing > Reversing' 카테고리의 다른 글

함수 호출 규약  (1) 2012.10.16
Windbg 명령어 요약  (0) 2012.10.13
혼동되는 어셈블리 명령어  (2) 2012.10.07
어셈블리어의 주소 지정 방식  (0) 2012.09.10
C코드->어셈코드 분석 [if, for, while]  (0) 2012.07.28