• Crackme 04 풀이

    2021. 5. 19.

    by. TONY07

    일단 프로그램을 실행시켜보았다. Serial 값에 알맞은 데이터를 넣어야 Registered가 클릭이 되는것 같다고 유추할 수 있다. 일단 활성화 시키기 위해 문자열이 저장되어있는지 확인한다.



     

     

    하지만 여기 문자열을 저장하는 코드 근처에는 Serial 로직이 존재 하지 않았다.
    그래서 모듈 호출로 strcmp 로 문자열을 비교할때나 strcat 으로 문사 복사할때를 노리기로 하였다.  그 순간 Serial 값이 노출 될 것이라고 생각하였다.

    위에 사진과 같이 strMove , strCopy , strcmp 도 존재하였다. 일단 strcmp 로 실행 하였다.

     

    BP를 40230D 에 걸고

    위와 같이 메모리 창에서 5EE25C 를 확인한 결과 아래와 같이 저장되어 있는 것을 확인 할 수 있다.


    아래와 같이 성공하였다.

    크래킹을 하려면 아래와 같이한다.

    이것 또한 전프로그램과 같이 je를 jne로 변경한다.

    di 레지스터는 0x00이기에 버튼이 활성화 되는것을 볼 수 있다.

     

    아래와 같이 성공하였다.






    하지만 우리가 하려고 하는건 크래킹이 아니라 리버싱이다. 이런 Serial 값이 어떻게 생성되며 어떤 알고리즘으로 되어있을까? 라는 생각을 해야 한다.

     

     

    그럼 일단 모듈간 호출 에서 사용하는 모듈들을 훑어본다.

    찾아보니 날짜의 관련된 함수를 사용하는 것을 확인하였다.
    연도(rtcGetYear) , 시간(rtcGetHourOfDay) 를 구한다. 그리고 더하고 곱하는 것으로 보인다.

     

     

    GetHourOfDay 에 결과 값 eax(0019FA8C) 에 들어가 있다.
    0x12(18)시  0A(10)분  :   6시 10분






    GetYear함수 eax(0019FA4C) 리턴값    07E5년  :   2021년

     

    아래와 같이 ebx에는 vbaVarMul 곱하기함수가 들어가 있다. 인자는 eax(05) , edx(12) 가 들어간다.

     

    그리고 eax(19FA7C) 에 5A 가 저장된다.

     

     

     

    다음은 vbaVarAdd함수로 19FA6C 의  5A와  19FA1C의 03E8 과 더한것을 저장한다.

    04 42 가 저장된 것을 확인할 수 있다. (리틀 엔디안)

     

     

     

    아직 ebx에 vbaVarMul 가 남아 있기에 call ebx 를하기에 edx, ecx, eax를 인자로 넣고 수행한다. 



     

     

    결과는 19FA6C 0442 (1090) , 19FA4C 07E5(2021) 를 곱한다. 1090*2021 = 2,202,890

    219D0A = 2,202,890

     

    Serial 키를 생성하는 알고리즘은 다음과 같다.

    공식은 (( 시간 * 5 ) + 1000) * Year  이다.

     

    '리버싱' 카테고리의 다른 글

    crackme-reverse 입문 튜토리얼 01  (0) 2021.05.19
    Crackme 08 풀이  (0) 2021.05.19
    Crackme 02 풀이  (0) 2021.05.19
    Crackme 05 풀이  (0) 2021.05.19

    댓글