프로그램 동작 방식

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 |