ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Lenas Reversing for Newbies] 13
    Wargame/Lenas Reversing 2021. 2. 20. 21:11

    1. 프로그램 실행

    첨부된 XoftSpy.exe를 이용해 프로그램을 설치한 후 실행해보자.

     

    실행화면 

    좌측 About 항목을 선택해보자.

     

    실행화면

    license가 등록되지 않았다고 한다. 이번 실습의 목표는 이전 실습들과 마찬가지로 프로그램 license를 등록된 상태로 크랙 하는 것이다.

     

    2. Debugging(with OllyDbg)

    OllyDbg로 프로그램을 실행시킨 후, About의 "Enter Registration Code" 버튼을 선택하자.

     

    Registration

    화살표 표시한 부분에 임의로 입력을 한 후 OK 버튼을 눌러보자.

     

    등록 실패

    위와 같이 "Invalid code."라는 문자열을 포함한 메시지 박스가 나타난다. MessageBox() API에 BP를 설정한 후 다시 등록을 시도해보자.

     

    디버깅

    위와 같이 BP에 적중한다. 이 상태에서 F8을 눌러 메시지 박스를 실행하면 곧 바로 "Invalid code." 메시지 박스가 출력된다. 아마도 이미 코드에 대한 검사를 마친 후 단순히 결과를 출력하는 듯하다. 이 함수의 시작 부인 0045C417 주소에 커서를 옮기면 아래와 같이 이 함수가 호출되는 부분을 확인할 수 있다.

     

    디버깅

    이 중 가장 첫 번째로 호출이 일어나는 004174AC 주소로 이동해보자.

     

    디버깅

    위와 같이 근처에 "Contratulations! ..." 문자열이 보이며, "Invalid code." 문자열 위로는 conditional jump 명령어가 보인다. TEST AL, AL의 결과에 따라 나타나는 메시지 박스가 달라지는 듯하다. 함수의 반환 값이 eax 레지스터에 담기므로 00417495 주소의 CALL 명령어에서 eax 레지스터가 세팅될 확률이 높다. 해당 부분에 BP를 설정한 후 프로그램 키 등록을 시도해보자.

     

    BP 적중

    BP에 적중한다. F7을 이용해 함수 내부로 들어가보면 굉장히 복잡한 루틴이 보인다. 그러나 반환 값에 주목하여 코드를 살펴보면 되므로, retn 명령어 기준으로 eax 레지스터 값이 어떻게 변화하는지 주목해보면 아래와 같은 특징을 발견할 수 있다.

     

    디버깅

    첫 번째 동그라미에서는 MOV AL, 1을 통해 1이 세팅되고, 두 번째 동그라미에서는 XOR AL, AL을 통해 0으로 세팅한 후 함수가 retn을 통해 종료된다. 함수의 시작 부분부터 F8을 이용해 한 줄씩 실행시키면서, 첫 번째 동그라미 너머로 점프하는 코드들을 전부 NOP으로 변경해준 후 함수를 빠져나와보자.

     

    디버깅

    위와 같이 이제는 점프가 일어나는 것을 확인할 수 있다. F9를 눌러 프로그램을 실행시키자.

     

    패치 성공?

    위와 같이 성공적으로 등록되었다는 메시지 박스가 나타난다. 확인 버튼을 눌러보자.

     

    패치 실패?

    그러자 창에는 아직까지 "... has not been registered"라는 문구가 나타난다. 무언가 패치가 되었음을 알 수 있다. 이번에는 문자열 탐색 기능을 이용해 OllyDbg에서 위의 "... registered" 문자열이 참조되는 곳으로 이동해보자.

     

    디버깅

    이전 패치와 비슷한 구조를 띠고 있다. TEST AL, AL에 의해 둘 중 하나의 문자열 참조가 일어나며, 이 경우 AL에 0이 아닌 값이 들어있어야 한다. (점프가 일어나면 안된다) 마찬가지로 00401492 주소의 CALL 명령어 함수 내부에서 eax 레지스터 값이 세팅될 확률이 높으므로, BP를 설정한 후 내부로 들어가서 코드를 살펴보자.

     

    디버깅

    F8을 이용해 한줄씩 코드를 실행시키다 보면, 위와 같이 XOR BL, BL을 통해 BL을 0으로 세팅한 후, 00435296에서 MOV AL, BL을 통해 AL 또한 0으로 세팅한다. 체크 표시한 부분의 JMP를 NOP으로 바꿔주어 MOV BL, 1이 실행되게끔 하여 이후에 MOV AL, BL을 했을 때 AL에 1이 세팅되도록 코드를 수정한 후, F9를 눌러 프로그램을 실행해보자.

     

    패치 성공!

    그러자 위와 같이 정상적으로 등록되었다는 문구가 나타난다.

     

    3. Comment

    Lenas 강의에서는 이번 실습을 Double checking trick이라고 표현한다. 또한 첫 번째 패치에서는 키 등록을 위해 에디트 컨트롤에 값을 입력하고, 내부적으로 그 값을 읽어들이기 위해 GetWindowText() API가 호출된다는 점에 착안하여 패치를 진행했는데, 블로그 글을 쓰면서 한번 다른 방식으로 진행해보았다.

    반응형

    'Wargame > Lenas Reversing' 카테고리의 다른 글

    [Lenas Reversing for Newbies] 15  (0) 2021.02.26
    [Lenas Reversing for Newbies] 14  (0) 2021.02.23
    [Lenas Reversing for Newbies] 12  (0) 2021.02.18
    [Lenas Reversing for Newbies] 11  (0) 2021.02.09
    [Lenas Reversing for Newbies] 10  (0) 2021.02.08

    댓글

Designed by Tistory.