크랙미 문제이다.
StolenByte를 구하라는 문장에서 이 파일이 패킹되어 있다는 것을 유추할 수 있다.

우선 파일을 실행하면 위와 같은 메시지가 출력되고 '확인' 버튼을 누르면 아래와 같은 메시지가 출력된다.


PEiD를 이용하여 어떠한 패커로 패킹되어있는지 알아보니 UPX로 패킹 되어 있다.

UPX로 패킹된 파일의 OEP는 맨 마지막 점프문 다음이다.

막상 마지막 점프문을 통해 점프해보면 늘 보던 코드와는 다르다.
우선 MessageBox 함수가 실행되기에 필요한 인자가 부족하다.
1 2 3 4 5 6 | int WINAPI MessageBox( _In_opt_ HWND hWnd, _In_opt_ LPCTSTR lpText, _In_opt_ LPCTSTR lpCaption, _In_ UINT uType ); |
출처 : MSDN
그래도 우린 첫 메시지 박스에 어떤 문자열이 출력되는지 안다.
바로 프로그램을 실행하자마자 나오는 아래와 같은 메시지이다.

그리고 우리는 이미 MessageBox 함수에 필요한 인자들("abex' 3rd crackme", "Click OK to check for the keyfile")을 본 적이 있다.

바로 위 빨간 네모 부분이다. 마지막 점프문 바로 위에서 본적이 있다!
이처럼 원래 있어야할 곳이 아는 다른 곳으로 옮겨진 부분을 StolenByte라고 한다고 한다..
슈발
좀 더 복잡하게 꼬아놓으면 못 풀 것 같다.
어쩃든 언패킹 하고 덤프 뜰 때 이렇게 StolenByte를 설치해놓으면 귀찮게 할 수 있다.
(StolenByte를 채우지 않고 덤프 뜨면 실행이 안 될테니까)

어쨋든 위처럼 401000부터 쭉 NOP로 되어 있고 MessageBox를 실행시켜도
마지막 JMP 전에 MessageBox에 필요한 인자들을 PUSH 해주어서 제대로 실행이 되는거다.
그 뒤는 간단하다.

CreateFile 함수를 이용하여 특정 파일이 있는지 확인하고
특정 파일의 크기를 확인한 후에 모든 조건이 들어맞으면 아래와 같은 메시지를 출력하고 끝난다.
