ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [리버싱 핵심원리 study] 8장 abex' crackme#2 분석(1)
    Reverse Engineering 2020. 12. 2. 01:44

    이번 포스팅에서는 abex' crackme#2라는 프로그램을 분석해본다. 해당 프로그램은 Visual Basic으로 제작되어 visual C++로 작성된 프로그램과는 다른 형태의 디스어셈 코드를 보이는데, 이런 부분에 대한 설명은 생략하고 크랙 하는데 초점을 맞춰 글을 작성해보겠다.

     

    1. abex' crackme#2 실행

    우선 해당 프로그램을 실행시켜보자.

    실행화면

    Name과 Serial 입력란과 세 가지 버튼이 보인다. 왠지 name과 serial을 입력하고 Check를 통해 만족하는 serial key인 경우 통과하는 형태의 프로그램으로 보인다. maple19out / maple19out을 입력하고 Check 버튼을 눌러보았다.

     

    성질내는 메시지박스

    예상대로 뭔가 조건을 만족하지 않아 Wrong이라는 메시지박스가 창에 나타난다.

     

     

    2. debugging (with x32dbg)

    이제 x64dbg를 이용하여 프로그램을 열어보자.

    초기 디버깅 화면

    본격적으로 코드를 들여다보기 전에, 무작정 코드를 하나하나 실행시키기보다 전략적으로 리버싱을 해보자. 해당 프로그램은 메시지 박스에서 '문자열'을 출력한다. 따라서 마우스 우클릭을 이용해 문자열을 참조하는 곳이 있는지 확인해보자. 오류가 날 때 출력하는 'Nope, this serial is wrong!' 부분을 찾아보면 좋을 것 같다.

     

    문자열 출력 부분

    여기서 이제 이러한 문자열을 출력하게 되는 배경을 생각해보자. 처음에 이름과 시리얼 키를 입력하였고, 어떠한 조건에 의해 wrong이라는 문자열을 출력하게 되는 것이다. 따라서 이에 대응되는 조건 분기문이 있을 것임을 예측해 볼 수 있다. 스크롤을 조금 올려보자.

     

    조건문 발견

    test 연산자는 logical compare(AND)를 통해 값을 세팅하고 바로 밑의 je 부분에서 jump가 일어난다. 만약 점프가 일어나지 않는다면 밑의 코드를 보아 Congratulations! 와 같은 문자열이 나와있는 것으로 보아 크랙에 성공할 수 있음을 예측해볼 수 있다. 조금만 더 스크롤을 올려 상단에 있는 어셈블리 코드를 살펴보자.

    argument passing...?

    test 코드가 실행되기 이전에 어떤 함수가 호출되고, 그 이전에 push edx, push eax가 실행되는 것으로 보아 함수가 호출되기 이전에 argument passing이 이뤄지는 것 같다. 왜 인지 입력 serial key와 실제 serial key 간에 string compare를 하고, 그 결과가 eax 레지스터에 반환되는 것 같다. edx와 eax 레지스터에 무엇이 담겨있는지 확인하기 위해 00403327 부분에 bp를 설정하고 프로그램을 실행시켜보자.

    eax, edx 레지스터 변화

    위 사진과 같이 lea 연산을 통해 eax 레지스터에는 0019F2A0가, edx 레지스터에는 0019F290이 담겨있음을 확인할 수 있다. 이제 덤프 창에서 해당 주소로 이동해보자. 

    hex dump 창

    이렇게만 봐서는 무슨 내용이 들어가 있는지 잘 보이지가 않는다. 마우스 우클릭을 통하여 스택에서 따라가기 기능을 이용하면 해당 주소 값에 무엇이 들어가 있는지 한눈에 보인다.

     

    스택 창

    위와 같이 edx, eax 주소 값으로부터 8byte 떨어진 곳에 처음에 입력했던 maple19out 문자열과 D1C5D4D0라는 시리얼 냄새가 나는 문자열이 보인다. 실제로 Visual Basic에서 사용하는 문자열 객체는 바로 문자열이 나타나지 않는다고 한다. 이제 저 D1C5D4D0이라는 문자열을 한 번 serial key에 입력해보자.

     

    크랙 성공!

    위와 같이 크랙에 성공하였음을 확인하였다. 그러나 Name에 다른 문자열을 집어넣으면 D1C5D4D0이라는 시리얼 키로는 통과하지 못하는 것을 확인할 수 있다. 즉, Name에 따라 Serial Key가 변한다는 것인데 이에 대해서 Serial 생성 알고리즘을 다음 포스팅에서 다뤄보겠다.

    반응형

    댓글

Designed by Tistory.