1. Home
  2. 보안 강좌/CrackMe
  3. [Solution] Abex' CrackMe #4 풀이

[Solution] Abex' CrackMe #4 풀이

실행
분석

안녕하세요 파일입니다. 오늘은 CrackMe #4번입니다. Abex Crackme 5개 시리즈 중 거의 막바지에 다다랐네요. 아마 이번편까지 작성하면 다음 5편이 마지막이 되지 않을까 싶습니다. 다 기초적인 문제들이라 재밌어서 먼저 다 풀고 정리해서 글을 올리는거지만 푸는 시간보다도 훨씬 오래 걸리는게 역시 글 작성이 아닌가 싶네요.

 

abex' crackme4.exe
0.02MB

다운로드는 여기서 해보실 수 있습니다.

 

실행

Image

이번엔 실행 파일 아이콘만 봐도 무슨 언어로 만들었는지 알겠네요 ㅋㅋ 이 아이콘은 VB6.0 으로 코딩할 때 exe 만들면 나오는 기본 아이콘입니다. 저번 CrackMe #2번 처럼 비베로 만들었나보네요.

 

Image

이번에도 시리얼(제품키) 을 입력해야 합니다. 그런데 이번건 보시면 아래 Registered 버튼이 활성화 되어 있지 않습니다.

 

Image

아무거나 입력해도 반응이 없네요. 보니깐 맞는 시리얼을 입력했을때 저 Registered 버튼이 활성화(Enabled) 되는 듯 합니다.

 

분석

Image

일단 아이콘에서 추정됐지만 VB6.0 컴파일러로 컴파일됐고, Microsoft Linker 6.0으로 링킹되었습니다.

그리고 일단 본 문제는 풀이를 알면 쉬운데 풀이를 모르면 좀 어렵습니다. 그리고 IDA를 사용해도 되긴 하는데 올리디버거로 푸는게 더 좋습니다.

 

 

Image

일단은 오늘은 올리디버거만 이용할건데요. 저번에 크랙미 2번 처럼 보시면 알겠지만 VB6.0의 메인 엔진인 ThunRTMain 을 호출해서 실행하고 있습니다. IDA는 함수 이름을 저번과 같이 표시해드리고자 추가로 가져왔습니다. 본 글에선 더이상 사용하지 않을거구요.

 

 

Image

일단 본 프로그램에 대해서 우리가 아는 정보라곤 프로그램 앞에 Registered 라는 버튼 뿐 입니다. 조금더 추가적인 정보를 얻고자 어셈블리 코드쪽에 오른쪽 클릭 - Search for - All referenced strings 를 통해서 본 프로그램에서 참조된 모든 문자열을 한번 찾아보겠습니다.

 

Image

밑으로 내리면 Well done! 이라는 수상한 성공 메세지가 보입니다.

더블클릭해서 해당 코드라인으로 이동해봅시다.

 

Image

이쪽으로 오니 성공시 실행되는 코드들이 보입니다. 사실 여기에 Break Point를 걸어도 별 의미는 없습니다. 왜냐면 여기는 제대로 된 코드를 입력해서 버튼이 활성화 됐을때 실행되는 코드일 것이기 때문입니다.

 

 

그러면 이제 어떻게 해야할까요? 이것에 대한 힌트로는 기본적으로 저번에 CrackMe #2번에서 설명드렸던 VB6.0의 이벤트 기반 프로그래밍에 대해 생각해봐야 합니다.

 

Image

이전에도 설명 드렸듯이.. VB6.0은 메인 함수에 모든 코드를 박아넣는게 아니라 어떤 이벤트가 발생하면 그에 맞게 코드가 실행되도록 설계되어 있습니다. 예를 들어서 저 Command1라는 버튼을 클릭하는 이벤트(상황)가 발생하면 click() 을 호출하도록 설계할 수 있습니다.

 

단순히 VB6.0에서 프로그래밍 할때는 저 Command1을 더블 클릭 해주면 클릭을 했을때 click() 이 실행되도록 자동으로 클릭 이벤트도 등록해주고, 그때 호출할 click() 함수도 자동으로 만들어준다고 하였습니다.

 

그런데 사실 이런 이벤트라는건 굉장히 여러가지가 있습니다. 예를 들어서 창이 꺼졌을때도 이벤트가 발생하고 (창이 꺼진 이벤트, 상황), 창을 내려도 이벤트가 발생하고, 저 폼(윈도우 창)에 무언가 내용을 적어도 이벤트가 발생합니다. 이 이벤트에 맞춰서 어떤 함수를 등록 시켜놓으면 그 함수를 실행시킬 수 있구요.

 

Image

기본적으로 이 프로그램의 경우 저 Serial 아래 있는 텍스트 박스에 무언가를 입력하다가, 맞는 시리얼이 되면 딱 Registered 가 활성화 되면서 인증을 할 수 있는 구조입니다. 

즉 결론적으로 저 텍스트 박스에 무언가 입력할때마다도 "이벤트" 가 발생합니다. 아마 기억상 textbox_changed 와 같은 이벤트 였던거 같은데요. 저기 텍스트 박스에 무언가 입력할때마다 이벤트가 발생하고, 그 이벤트에 맞춰서 실행되는 코드가 있을겁니다.

 

그 실행되는 코드가 바로 시리얼이 맞는 시리얼인지 확인하는 부분이겠죠.

 

void serial_check(){
if(텍스트박스 == "맞는 시리얼"){
메세지 박스("시리얼이 맞았습니다")
버튼.enabled = true //버튼 활성화
}
}

대충 Pesudo Code 로 작성해보면 위와 같은 serial_check() 함수가, 저 Serial 부분에 텍스트를 입력하는 이벤트가 발생할 때마다 호출되어서, 매번 입력때마다 텍스트 박스의 텍스트가 맞는 시리얼인지 체크하고, 맞다면 버튼을 활성화 해주는 거겠죠. 

 

if(텍스트박스 == "맞는 시리얼")

그러니깐 결론적으로 입력을 할때마다 저렇게 텍스트 박스의 시리얼이 맞는지 검사하는 코드가 실행될 거라고 추측, 기대해볼 수 있습니다.

 

저번에 크랙미 2번 풀이를 보셨으면 알겠지만.. 기본적으로 비주얼 베이직은 이런 문자열 검사나 비교를 함수를 호출하여 수행합니다. 그러니깐 올리디버거로 이 프로그램의 모든 함수 호출 부분을 보고 대충 문자열을 비교하는 함수에 BP를 걸어주면 되겠습니다.

 

그러면 텍스트 박스에 시리얼을 입력한 순간 이벤트가 발생해서 시리얼이 맞는지 체크하는 함수가 실행될 거고, 거기서 이제 문자열을 비교하기 위해 문자열 비교 함수를 수행하는 위치에서 정확히 멈출겁니다.

 

 

Image

다시 코드로 돌아와서 오른쪽 클릭 - Search for - Intermodular calls 를 통해 어떤 함수가 여기서 호출되고 있는지 확인해봅시다.

 

Image

문자열을 비교하는 함수가 여러개였으면 힘들었을거 같은데 눈을 크게 뜨고 함수들 호출을 보니 문자열을 비교 하는것으로 추정되는 함수 이름은 딱 하나밖에 없어보입니다. vbaStrCmp 네요. C언어의 strcmp 와 비슷한데 비주얼 베이직에서 문자열 비교시 사용하는 함수가 아닐까 싶습니다. 이 함수가 호출되는 순간에 문자열 비교가 이루어진다는 것이므로 저기 Strcmp에 클릭해놓고 F2를 눌러서 Break Point를 걸어둡니다.

 

빨간색으로 표시됐다는게 BP가 걸렸다는 증거입니다.

더블클릭해서 일단 저 위치로 이동해놓고 디버깅을 시작해보겠습니다.

 

Image

일단 디버깅을 실행하면 이벤트가 발생하기 전까진 Serial을 검사하는 함수가 실행되지 않을겁니다. 저기 텍스트 박스에 한글자라도 입력을 해봅니다.

 

Image

한글자 입력한 순간 프로그램이 멈추면서 아까 BP에 걸어뒀던 위치에서 멈춥니다. text changed 이벤트가 발생해서 이제 텍스트를 비교하는 위치로 분기되었기 때문입니다. 입력한 순간 멈춘걸 보니 우리 생각대로 문자열 비교하는 위치를 잘 찾아낸듯 합니다. 이제 vbaStrCmp가 비교하기 위해 EAX와 ECX를 Push해서 비교를 하고 있는데요.

 

vbaStrCmp(ECX, EAX) 와 같은식으로 호출이 이루어 지고있습니다. 저 EAX와 ECX 값은 비교할 문자열의 시작 주소를 가리키고 있었습니다. 저 ECX와 EAX 레지스터 값을 Stack 메모리랑 레지스터 탭에서 한번 훔쳐봅니다.

 

Image

저기 ECX 레지스터를 보니깐 2245530 이라는 매우 수상한 문자열이 보입니다. ECX 레지스터엔 006A5CEC 라는 주소값이 저장되어 있는데, 이 주소가 RAM위에 저장된 2245530 문자열의 시작주소를 가리키고 있습니다. 

 

Image

올리디버거에선 이렇게 문자열을 어떤 주소가 가리키고 있으면 그 문자열의 값을 같이 보여주는 기능이 있습니다.

 

이 기능을 IDA에서 재현하지 못해서 문자열 관련 문제를 풀때는 항상 올리디버거랑 같이 사용을 하고 있네요 -.- 이 기능만 IDA에서 쓸 수 있다면 사실 올리디버거를 쓸 이유가 크게 없지만요.. 혹시 이런 기능을 IDA에서 사용하는 방법을 아시는 분은 꼭 댓글 부탁드립니다.

 

어쨌던 간에 저 2245530 과 문자열을 비교하는 코드를 수행하므로 저게 시리얼 키로 추정됩니다.

 

Image
Image

값을 제대로 찾았네요 ㅎㅎ 맞는 값을 입력하니 Registered 버튼이 활성화 되었습니다.

올리디버거에서 문자열 주소를 가리키고 있으면 내용을 보여주는 기능을 활용해서 문제를 쉽게 풀 수 있었습니다. 

 

SNS 공유하기
네이버밴드
카카오톡
페이스북
X(트위터)

최근글
인기글
이모티콘창 닫기
울음
안녕
감사
당황
피폐