본문 바로가기
Study/Reversing

Unpack, Back To User mode

by Melpin 2015. 5. 18.

upx로 패킹되어 있는 것을 올리디버거 덤프 플러그인을 사용하여 풀어 볼 수 있다.

먼저 tuts4you.com 으로 가서 OllyDump.dll을 찾아 다운받고

올리디버거 폴더의 Plugin 에 넣는다.




이제 upx로 압축되어 있는 문제파일인 CrackMe2.exe를 올리디버거로 열어보면

코드가 압축되어 있다는 것을 올리디버거가 알려주고 더 분석할 것인지를 묻는다.



예(Y) 를 눌러 진행한 뒤 스크롤을 조금 내리면

DB 00 으로 채워져있는 부분 위를 보면

압축이 모두 풀려 메모리에 올라가 있는 초기상태인 OEP부분으로 가는 JMP문이 보인다.



그부분에 BreakPoint를 정해주고 실행을 하면, 이 주소값에서 한번 정지상태가 된다.

이때 StepOver(F8)로 진행해주면 OEP의 위치로 이동한다.



PUSH EBP 위치에 올리디버거의 Plugin을 이용한 덤프를 하면 된다.

upx가 패킹을 하는 원리는 기존의 소스 코드 부분들을 모두 새로운 upx섹션에 압축하여 저장을 해놓고,

실행을 하는 부분에서는 upx 섹션에 저장해놓은 부분을 풀어서 메모리에 올리게 된다.

그래서 OEP에 압축이 다 풀려서 올라가기 때문에 이 부분에서 프로그램을 덤프받으면 본래 코드를 볼 수 있다. 



그냥 덤프받기만 하면 IAT 정보가 정확하지 않으므로

덤프를 받을때 Rebuild Import를 체크하는 것이다.



덤프한 파일을 CrackMe2_1.exe로 저장해주자.

그리고 PEID를 통해 열어보면

upx압축이 풀리고 제작 툴인 볼렌드 델파이라고 탐지해주는 것을 확인할 수 있다.



이제 CrackMe2_1.exe를 올리디버거로 분석해보자

실행시켜보면 아까와같이 압축되어있다는 알림창이 나타나지 않는다.


back to user 모드 기능으로 특정 이벤트를 일어나기 전에 설정해두고 Call 명령이 일어난 바로 다음 위치를 잡을 수 있다.

사용하는 순서는 다음과 같다.

1. 프로그램 실행(F9)

2. 프로그램을 메세지 창과 같은 정지된 상태로 만든다.

3. 일시정지(F12)

4. back to user mode (ALT + F9)

5. 프로그램에서 이벤트 발생(메세지 창에서 확인 버튼 클릭)

6. 올리디버거에서 해당 부분에 커서가 설정된다.




프로그램을 메세지 창과 같은 정지상태로 만들었을때 F12(일시정지)를 누르면


우측하단이 Paused 라고 표시된다.

그상태에서 ALT + F9(back to user)를 누르면


우측하단에 Back to user 라고 표시된다.

Wrong Serial

You are a bad cracker!

메세지 박스를 닫아주면

MessageBoxA 함수가 호출된 다음의 위치가 자동으로 선택된다.



이제 MessageBoxA에 들어가는 text가 ESI에 의해서 설정되는 것을 확인할 수 있다.

ESI에 있는 주소값을 CTRL + G 단축키를 이용해 검색하면

바로 그 주소값으로 이동할 수 있다.



이동하면 다음 문자열들을 볼 수 있다.



여기서 한페이지 위로 올려보면 값들이 구분되는 부분을 볼 수 있다.



BreakPoint 를 잡아 놓고 Step into(F7)하다 보면 CMP를 통해 내가 입력한 값과 시리얼 키를 비교하는 부분이 나타난다.

그리고 같다면 JNZ SHORT CrackMe2. 0042B79 에서 구분되게 된다.

이 부분에서 ZF를 1로 강제로 바꿔주면 문제를 해결할 수 있다.



그리고 아까 본 숫자를 입력하면 맞는 시리얼키라는것을 알 수 있다.



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

KeyFile 체크 문제 풀이, 바이너리 수정  (0) 2015.05.19
키젠문제 풀이  (0) 2015.05.18
어셈블리 명령어  (0) 2015.05.15
CPU레지스터와 데이터타입  (0) 2015.05.15
abexcm1.exe풀이  (0) 2015.05.14

댓글