PEiD 툴로 확인해 보면 UPX로 확인된 것을 볼 수 있습니다.(UPX 언팩은 Basic 05-1 글을 참고)
잘못된 시리얼을 입력했을 시 Wrong serial!! 메시지가 나타나는 것을 확인할 수 있습니다.
이번에는 Ollydbg의 Back to user 모드를 이용하여 문제를 풀겠습니다.
Back to user 모드란 프로그램이 멈춘 상태에서 지금 사용하고 있는 이벤트가 있는 코드로 이동하는 모드입니다.
이 모드를 사용할 때는 프로그램이 멈춰 있어야 합니다.
먼저, Ollydbg에서 프로그램을 실행(F9)시킨 후 임의의 문자열을 입력하여 메시지 창을 띄웁니다.
이 상태에서 Ollydbg를 활성 시킨 후 일시정지(F12) 시킨 후 AlT + F9를 눌러 오른쪽 아래를 Back To User로 바꾼 후에
ERROR 창의 확인을 누르면 다른 블로그의 글들처럼 이벤트를 호출한 코드로 가 그 위에 문자열들이 있어야 하는 데…
없네요.
32bit용이라 64bit에서도 디버깅 가능하도록 Olly Advanced 플러그 인도 설치하였지만…
가끔 Ollydbg가 미칠 때가 있다더니...제 올리는 자주 미치네요...원래 이런 줄 알겠어요..
여기서 풀이 방법을 바꾸겠습니다. 올리가 치매 끼가 있는지 All referenced text strings 에서도 아무것도 안나와요.
단단히 맛이 갔나봐요.
처음에는 코드 창에서 Ctrl + B 를 눌러(혹은 오른쪽 마우스 -> Search for -> Binary String) ASCII에 serial을 입력한 후
OK를 눌러 검색합니다.
그러면 아래 나온 HEX 값들이 있는 곳으로 이동하게 됩니다.
아래 Dump창에서 값들이 있는 주소로 이동을 하면 우리가 본 Wrong serial!!! 을 찾을 수 있습니다.
다시 코드창에서 Ctrl + B 를 누른 후 Wrong serial!!!의 W 주소 값을 검색합니다. 단, 주소값의 입력은 리틀엔디안 방식(Little Endian, 반대로는 Big Endian 이 있다.)
을 따르므로 입력할 때는 1C 00 42 00 으로 입력하여 검색해야 합니다.
이렇게 이동하면 우리가 원하는 코드를 찾게 됩니다!!!! 야호!!!! 너가 미쳐도 난 찾고 말겠다!!!
위에 표시된 코드를 보면 입력한 값과 어떤 문자열(분명 저게 시리얼이겠죠)을 스택에 넣은 후 함수를 호출합니다.
함수 호출의 결과물은 EAX에 저장된 후 ESP의 값을 +8, 그 다음 줄에 TEST EAX, EAX 코드를 볼 수 있습니다.
이는 함수 호출 후 결과물을 통해 조건분기시 자주 쓰인다고 합니다. EAX 끼리의 AND 연산을 통해 반환값이 1 또는 0 인지 확인할 수 있거든요.
TEST EAX, EAX 의 결과물로 0이면(함수 반환값이 0) ZF(Zero Flag)의 값이 1이 되고
JNZ(Jump if Not Zero) 명령어에서 점프를 안하고 아래로 내려오게 됩니다.(JNZ는 ZF = 0 일때 점프)
입력한 문자열이 아닌 다른 문자열("AD46DFS547")을 입력했을 때 성공 메시지 창이 뜨는 걸로 보아 Serial 이 맞나 봅니다. 코드엔진에서는 OEP+Serial 로 인증하시면 됩니다.