본문 바로가기

공부/리버싱 핵심원리

abex' crackme #2 분석

1. abex' crackme #2 실행

abex' chacma #2: visual basic으로 작성된 프로그램

시리얼 키(serial key)를 검증하는 프로그램

현재 상태

 


 

2. visual basic 파일의 특징

2.1 visual basic (VB) 전용 엔진

msvbvm60.dll (Microsoft visual basic virtual machine 6.0) 이라는 전용엔진 사용

 

2.2 N code vs. P code

VB 파일은 컴파일 옵션에 따라 N code와 P code로 컴파일됨

N (Native) code

>> 디버거에서 해석이 가능한 IA-32 Instruction을 사용

P (Psuudo) code

>> Interpreter 언어 개념

>> VB 엔진으로 가상 머신을 구현하여 자체적으로 해석 가능한 명령어 코드를 사용

>> P code를 해석하려면 VB 엔진을 분석하여 에뮬레이터를 구현해야 함

 

2.3 Event Handler

VB는 주로 GUI 프로그래밍을 할 때 사용

Windows 운영 체제의 Event Driven 방식으로 동작

>> 주요 사용자 코드가 main()함수나 WinMain()함수에 존재하는 것이 아님

>> 각 event handler에 사용자 코드가 존재

      ex) abex' crackme #2의 경우: [Check] 버튼의 handler에 사용의 주요 코드가 존재

 

2.4 undocumented 구조체

VB에서 사용되는 각종 정보들(Dialog, Control, Form, Module, Fuction 등)은 내부적으로 구조체 형식으로 파일에 저장됨

구조체 정보는 비공개 >> 디버깅이 어려움

 


 

3. 디버깅 시작

F7로 CALL에 들어가면...
JMP 등장

 

3.1 간접 호출

40123D : CALL 00401232

>> ThunRTMain() 함수 호출 목적

>> 그러나 직접 ThunRTMain() 함수를 호출하지 않음. 대신 중간에

401232 : JMP DWORD PTR DS: [4010A0]

을 이용하여 간접 호출 (Indirect Call)

 

3.2 RT_MainStruct 구조체

RT_MainStruct 구조체 정보는 401E14 주소에 저장되어 있음

RT_MainStruct 구조체는 다른 구조체들의 주소를 저장하고 있음 

 


 

4. crackme 분석

Error 메시지 박스의 문자열을 단서로 하여 분석할 코드의 저장 위치를 탐색

>> "Wrong serial" 문자열 탐색

>> 추측: 입력된 문자열을 어떤 값과 비교하여 serial 값이 맞는지 확인할 것이다.

문자열 검색으로 오류메시지 출력 코드 위치에 왔다

 

4.1 문자열 검색

분기 및 성공 코드

 

4.2 문자열 주소 찾기

추측: vbaVarTstEq()가 serial 문자열 비교 함수

밑의 rrrr은 내가 입력한 시리얼코드
C8C8C8CA 입력 시 성공

그런데...

이름이 바뀌면 분명 같은 시리얼 코드를 입력했음에도 틀렸다고 뜬다

>> 이름에 따라 다른 시리얼코드를 발급한다 추측

 

4.3 Serial 생성 알고리즘

serial 비교 & 조건 분기 코드를 포함한 함수의 시작 부분 찾기

VB 파일에는 함수와 함수 사이에 NOP 명령이 존재한다. NOP: No operation (아무 동작도 없이 그냥 CPU 클럭만 소모)

해당 조건 분기 코드의 앞쪽에서 "PUSH EBP" 명령이 있는 부분을 찾는다.

>> 함수가 호출되었다면, 시작 부분에서 스택 프레임을 만들려고 할 것이기 때문.

추측: [Check] 버튼을 누르면 호출되는 event handler

 

4.4 Serial 생성 알고리즘 예측

일반적인 방법 (추측)

>> 입력된 문자열을 읽는다. > 문자열을 읽기 위해 API 사용

>> 입력된 문자열을 기반으로 Serial을 만드는 알고리즘을 수행한다.

 

4.5 Name 문자열 읽는 코드

CALL 명령어 위주로 디버깅 > "입력한 문자열" 읽는 부분 찾기

CALL 위주로 찾다가 의미있어보이는 함수 발견

1. 402F98 주소에 BP 설정 후 실행

2. 스택 창에서 위에서 두번째 데이터 확인 (or EDX 값 확인): EBP-88의 값

3. 덤프창에서 go to로 EBP-88 주소값으로 이동

 

4.6 암호화 루프 > Serial 생성 알고리즘

추측: 암호화 or 반복문 사용하여 인코딩

메시지 박스가 뜰 때까지 실행한 모습

변환된 시리얼코드가 추가되는 걸 볼 수 있다

'공부 > 리버싱 핵심원리' 카테고리의 다른 글

IAT 따라가기  (0) 2024.05.12
PE File Format  (0) 2024.05.11
Lena's Reversing for Newbies  (0) 2024.04.17
abex' crackme #1 분석  (0) 2024.04.15
Hello World! 리버싱  (1) 2024.04.15