ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [리버싱 핵심원리 study] 11장 Lena's Reversing for Newbies
    Reverse Engineering 2020. 12. 23. 22:09

    Lena라는 사람이 www.tuts4you.com/게시판에 40여 개의 crackme라는 강좌를 올려놓았다고 한다. 나중에 한 번 들어가서 보는 것도 괜찮을 것 같다. forum.tuts4you.com/files/categories/ 에서 관련된 파일을 다운로드할 수 있다. 리버싱 핵심원리 책에서는 Tut.ReverseMe1.exe 파일을 다뤄보고 이에 대한 crack을 진행한다.

     

    1. 프로그램 실행

    실행화면 1

    위와 같은 문구가 출력된다. 확인 버튼을 눌러보자.

    실행화면 2

    무언가 적합한 Regcode를 발견하여 Register me! 버튼을 눌렀을 때 통과할 수 있는 구조 같다. SmartCheck는 Numega 사에서 만든 크래커들이 자주 이용하는 툴이라고 한다. Nag? 버튼을 클릭해보자.

    실행화면 3

    위와 같이 프로그램을 초기에 실행시켰을 때와 같은 메시지 창이 출력된다. 확인 버튼을 누르면 다시 실행화면 2와 같은 상태로 돌아간다. 이제 아무 키나 입력하고 Register me!를 눌러보자.

    실행화면 4

    역시 Wrong registration code !라는 문구를 출력한다. 이제 본격적으로 크랙을 하기 위해 디버깅을 해보자.

     

    2. Debugging(with x32dbg)

    디버깅 1

    우선 프로그램이 메시지 박스를 출력한다는 점에 착안하여, 메시지 박스 호출 부분을 조작해보자. 마우스 우클릭을 통하여 MsgBox가 호출되는 부분을 검사해보자.

    디버깅 2

    위와 같이 총 4 곳에서 MsgBox가 호출되는 것을 확인할 수 있다. 마우스 우클릭을 통하여 모든 부분에 BP를 설정하고, F9를 눌러 프로그램을 진행시켜보자.

    디버깅 3

    위와 같이 00402CFE 지점에서 멈췄는데 윗 부분에 "Get rid of all Nags and find the right registration code !"라는 문자열이 있는 것을 확인할 수 있다. 계속 F9를 눌러 실행시켜보면 이전 실행화면과 같은 창이 나타나는 것을 확인할 수 있다. 따라서 00402CFE 지점을 적절히 수정한다면 Get rid of all Nags 이 부분을 달성할 수 있을 것 같다. 먼저 해당 부분을 Call ... 대신 add esp, 14로 스택을 정리하는 형태로 어셈블리 명령어를 수정해보는 접근을 생각해 볼 수 있다. 그러나 이러한 방법은 MsgBox의 return 값이 담기는 eax 레지스터에 대한 처리를 할 수 없으므로 다른 방법을 생각해봐야 한다. 스크롤을 조금 더 올려보자.

    디버깅 4

    위와 같이 stack frame을 생성하는 코드를 발견할 수 있다. 따라서 다음과 같이 생각해 볼 수 있다. 어떠한 함수 A가 호출되고, A안에서 MsgBox가 호출된다. 따라서 함수 A가 호출되는 부분에 바로 return을 하게 되면 MsgBox가 호출되지 않을 것이다. stack frame을 생성하는 코드를 다음과 같이 바꿔보자.

    디버깅 5

    위와 같이 수정하고 다시 프로그램을 실행시켜보면 Nag? 버튼을 클릭하여도 아무런 반응이 일어나지 않는 것을 확인할 수 있다.

     

    이제 Regcode를 살펴보자. 적절한 Regcode가 입력으로 들어온다면 그에 대한 처리가 있을 것이고, 적절하지 않은 Regcode가 입력으로 들어오면 실행화면 4와 같은 창이 나오게 된다. 이번에는 출력되는 문자열에 기반하여 디버깅을 해보자. 우선 마우스 우클릭을 하여 문자열이 출력되는 부분들을 확인해보자.

    디버깅 6

    아마도 Yep ! You succded registering ! 문자열을 출력하는 조건이 적합한 Regcode가 들어왔을 때임을 직감할 수 있다. 해당 부분으로 이동해보자.

    디버깅 7

    해당 문자열의 윗부분에 "I'mlena151" 이라는 문자열을 stack에 쌓고 varStrCmp라는 함수를 호출하는 것을 확인할 수 있는데 vbaStrCmp()는 Visual Basic에서 사용자가 입력한 문자열과 대상 문자열을 비교하는 함수이다. I'mlena151을 Regcode로 입력하고 Register me!버튼을 눌러보자.

    디버깅 8

    위와 같이 크랙에 성공하였음을 알 수 있다.

    반응형

    댓글

Designed by Tistory.