관리 메뉴

ㄴrㅎnㅂrㄹrㄱi

시스템보안 - 17일차 (리버스 엔지니어링 - UPX unpacking) 본문

개인적인자료/중요 참조자료

시스템보안 - 17일차 (리버스 엔지니어링 - UPX unpacking)

님투 2008. 12. 17. 18:41
반응형

■ UPX unpacking

 - crackme2.exe 파일은 upx packing이 되어 있기 때문에 ollydbg로 열었을경우 정상적인 코드를 보기 어렵다.
   upx unpacking 후 풀면 간단한 문제가 되겠다. crackme2.exe파일을 unpacking 해보자.

 

1. OllyDbg 로 CrackMe2.exe 파일을 열게되면 다음과 같은 메시지가 뜬다.

  

2. PEiD 를 이용하여 CrackMe2.exe 파일이 UPX packing 되어 있는것을 알 수 있다.

 

 3. CrackMe2.exe 파일을 OllyDbg로 열어보면 pushad가 보인다. F7(step into)를 한번 눌리자.

   우측을 보게되면 레지스터 값들이 차례대로 들어가 있는것을 확인할 수 있다.
   pushad가 하는 역할이다. 레지스터의 값을 스택에 넣어준다.

 

아래의 그림 우측의 스택의 그림을 본 결과 ESP가 최상위 스택 주소값 가지고 있다는 것을 확인할 수 있다.

  

4. 그렇기 때문에 ESP를 Dump를 뜨고 breakpoint 를 걸어 둘 것이다.

   우선 아래의 그림과 같이 Dump를 뜬다. 

  

5. 덤프를 뜨고 나면 하단의 4byte 를 블럭지정후에 Hardware breakpoint 를 걸어주자.

 

 

6. breakpoint 가 잘 걸렸는지 확인해본다.


 

 7. breakpoint 걸고 F9(run)를 눌리면 JMP 로 가게 되는데 바로 위에를 보면 POPAD가 있을 것이다.

  UPX 의 특징이 PUSHAD로 레지스터값들을 저장해놓은 후에 OEP 진입전에 POPAD를 하므로써 레지스터값을 복원하는 것이다.

  즉, POPAD후 Jump하는 곳이 OEP라는 것을 알수있다.

  

8. JMP 에서 F7(Step into)를 하게되면 기다리고 기다렸던 OEP를 찾게된다.


 

 9. 하지만 packing 으로 인해 코드가 깨진 상태이기 때문에 아래와 같이 재분석을 해주자.

 

 10. 코드 재분석으로 인해 아래와 같이 코드가 알아볼 수 있도록 깔끔해진다.

 

 11. 이제 Dump debugged process 기능을 이용하여 지금까지 한 작업을 저장하도록 하자.

  12. 아래의 Rebuild Import 체크상자의 체크표시를 해제해준 후에 Dump버튼을 눌려 적당한 이름(CrackMe3.exe)으로 저장한다.

 

 13. 생성한 파일을 실행해보도록 하자. 아래와 같은 오류가 뜨면서 정상실행되지 않는다.

    이유는 코드만 덤프를 떴을뿐 실행되어지는 dll 모듈들은 덤프를 뜨지 않았기 때문이라고 할 수 있다.

  

14. dll모듈 또한 덤프뜨기 위하여 아래와 같이 LordPE 툴을 사용하여 실행중인 crackme2.exe를 선택하고

    우측의 RebuildPE 버튼을 눌려서 코드덤프 떠놓은 CrackMe3.exe를 선택해주도록 하자. 

 

 

15. unpacking 되었는지 확인하기 위하여 PEiD 툴을 사용하여 확인해본다.

 

 unpacking 됐음을 알 수 있으므로 CrackMe3.exe를 실행하여 확인해보고 이상없으면 OllyDbg로 크랙하여 보자!!


반응형
Comments