본문 바로가기

Reversing/Introduction to reversing

abex crackme 4

프로그램 동작 방식

 

Visual Basic

: Microsoft사에서 쉽고 간편하게 Windows 프로그램을 만들 수 있게 출시한 프로그래밍 툴이자, 프로그래밍 언어

  • MSVBVM60.DLL에 있는 API를 호출하면서 동작을 수행함.
  • 이벤트 기반 언어 → 그래픽을 기반으로 화면을 구성하고 이벤트를 등록해 프로그램을 만듦.
  • 함수와 변수는 관련된 Event Handler에 종속되어있다.
  • Interpreter 방식으로 동작함
    • 기계어가 아닌 중간 상태인 p-code 상태로 저장되어있어서 프로그램 실행시 p-code를 기계어로 바꿔주는 작업이 추가로 필요함.

 

  • 임의의 숫자를 입력하더라도 Registered 버튼이 활성화되지 않음.
  • 올바른 Serial 입력하면 Registered 버튼이 활성될 것으로 보임.

 

API 검색

  • 오류메시지를 먼저 확인 할 수 없으므로 문자열 검색으로 분석의 실마리를 찾기 어려움
  • 이때 사용하는 방법이 API 검색

 

Serial(일련번호)는 문자열 비교 함수를 많이 사용하기 때문에 모듈에서 호출하는 API 중 비교 함수를 찾아보자.

 

 

프로그램 구조 분석

 

00402320 ~ 00402328

00402320  50               PUSH EAX
00402321  51               PUSH ECX
00402322  FF15 48104040    CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCmp>]
00402328  8BF8             MOV EDI,EAX
  • 문자열 비교 함수 호출
  • __vbaStrCmp는 VB 문자열 비교 함수로, 두 문자열을 비교해서 결과를 EAX에 반환.
  • MOV EDI, EAX: 문자열 비교 결과를 EDI에 저장.

 

00402345 ~ 00402347

00402345  66:8 5FF         TEST DI, DI
00402347  74 3E            JZ SHORT 00402387
  • TEST DI, DI는 DI 값이 0인지 확인해서 ZF를 설정하는 명령어
  • 결과가 0이면 ZF(Zero Flag) 설정됨
  • JZ는 Zero일 경우 점프 → 즉, ZF가 0일 경우 00402387로 점프

 

  • 점프문이 어떤 역할을 하는지 알아보기 위해서 점프문 바로 전에 Break Point 설정
  • Serial 입력창이 나오는데, 숫자 하나만 입력해도 디버깅이 자동으로 실행되면서 Break Point에서 멈춘다.

 

이때 레지스터 값을 확인하면, EDI에는 0000000이 들어있고, DI는 EDI의 하위 16bit이므로 DI에는 0000이 저장되어있음을 알 수 있다.

 

  • TEST DI, DI 를 실행하면 DI에 NULL이 들어있으면 ZF를 1로 설정하는 동작을 수행한다.

ZF 값을 1에서 0으로 강제로 변경해보자.

  • ZF을 0으로 바꾸고 프로그램을 다시 실행해보면, Registered 버튼이 활성화되고 버튼을 누르면 성공 메세지를 확인할 수 있다.

 

 

점프문 윗부분을 추가적으로 더 살펴보자.

  • TEST DI, DI 는 EDI의 하위 16bit에 들어있는 값을 사용해서, 올바은 Serial이 입력되었는지 확인하는 역할을 한다. 따라서 EDI에 누가 값을 넣어주는지 알아내면 문제를 풀 수 있다.

 

00402320 ~ 00402328

00402320  50               PUSH EAX
00402321  51               PUSH ECX
00402322  FF15 48104040    CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCmp>]
00402328  8BF8             MOV EDI,EAX
  • 문자열 비교 함수 호출
  • __vbaStrCmp는 VB 문자열 비교 함수로, 두 문자열을 비교해서 결과를 EAX에 반환.
  • MOV EDI, EAX: 문자열 비교 결과를 EDI에 저장.

⇒ 여기서 EAX의 값이 EBI에 저장되기 때문에, 문자열 비교 함수 EAX, ECX이 어떤 값인지 확인하면 Serial을 알 수 있을거라고 추정할 수 있다.

 

  • Break Point를 설정하고 재시작하면, Serial을 입력하는 창이 나오고 9를 입력하면 자동으로 디버깅이 되면서 Break Point에서 멈춘다.

 

  • PUSH EAX를 실행하고 EAX에 들어있는 값을 확인해보자.

 

EAX 레지스터에는 0047B03C라는 주소가 저장되어있고, 이 주소에는 9가 저장되어있다.

(주소는 계속 변경됨)

 

ECX에 들어있는 값을 확인해보면 2035125임을 확인할 수 있다. (계속 변경됨)

따라서, Serial이 2035125임을 알 수 있다.



'Reversing > Introduction to reversing' 카테고리의 다른 글

Lena Reversing tutorial 17 - Removing NAGs  (0) 2025.05.05
abex crackme 5  (0) 2025.05.05
abex crackme 3  (1) 2025.05.05
abex crackme 2  (0) 2025.05.05
abex crackme 1  (2) 2025.05.05