본문 바로가기

Reversing/Simples Creckme

Simples Crackme 2

Simples Crackme 2
 - Question

  · Name 문자열에 맞는 Serial을 찾아내는 문제

  · 성공/실패 Message

 

 - Solve
  · 문제를 풀기위한 정보
  ◦ 구성 함수 파악
  ◦ Program 진행방식 파악
  ◦ 암호화 과정 파악
  · 구성 함수 파악

  ◦ 실행 후 Menu에서 'Search for → Name (label) in current module'을 선택해 사용된 함수 목록을 확인한다.

  ◦ vba라는 함수들을 확인할 수 있으며 Visual Basic으로 만들어진 Program이라는 것을 파악할 수 있다.
  · Visual Basic 특징
  ◦ Visual Basic Compiler MSVBVM60.dll(The Thunder Runtime Engine)이라는 전용 엔진을 사용한다.
  ◦ Visual Basic Compiler는 함수를 호출 시 MSVBVM60.dll이 함수를 호출하도록 만들고 해당 함수 내에서 Win32 API의 user32.dll의 함수를 호출하는 방식으로 엔진 자체에서 직접적으로 함수를 호출하지 않고 user32.dll에서 함수를 간접적으로 호출하는 간접호출방식이 주로 사용된다.
  · Program 진행방식 파악

  ◦ Program을 OllyDbg로 Debugging해보면 PUSH 명령어와 CALL 명령어를 지나 JMP 명령어로 ThunRTMain이라는 함수가 호출되는 것을 알 수 있으며 이 함수를 지나자마자 GUI로 구성된 문제 창이 나타는 것을 볼 수 있다.
  ◦ GUI 함수가 호출된 후 해당 GUI를 이용해 문자열을 Stack에 입력받은 후 'Check' Button을 누르면 Name에 입력된 문자열을 암호화 한 후 Serial에 입력된 문자열과 비교하는 절차로 진행된다.
  · 성공/실패 Routine 찾기

  ◦ 문자열 검색(Search for → All referenced text strings)을 통해 성공/실패 Routine 명령어가 있는 곳을 확인해본다.
  ◦ Message Box로 출력할 내용을 살펴보면 4글자미만일 경우 Error를 발생시키고 성공 시 'Congratulations!' Message를, 실패 시 'Wrong Serial' Message를 출력한다.
  ◦ 또 여기서 파악할 수 있는 점은 성공 Message가 앞에 있는 것으로 보아 비교 명령어가 있는 장소는 성공 Message 위에 있다는 것을 파악할 수 있다.

  ◦ Message를 건너뛰는 JMP문을 찾아보면 성공 Routine을 실행하지 않도록 성공 Routine을 건너뛰게 하는 JMP문인 'JE Abex_Cra.00403408'을 찾을 수 있다.
 · 암호화 Routine 찾기
  ◦ 암호화 Routine은 성공 Routine을 건너뛰게 하는 'JE Abex_Cra.00403408' 윗부분에 있을 것으로 예상할 수 있으며 문자열은 한 번에 암호화 할 수 없으므로 반복문이 사용되는 구간을 찾아내야한다.

  ◦ 여러 번 실행시켜 보면 위 구간이 반복되는 것을 확인할 수 있으며 총 반복횟수는 '[총 문자열 길이]-1'을 확인 할 수 있고 이 구간 내에서 암호화 Routine이 존재한다.

  ◦ 확인 해보면 0x64를 문자에 더하는 것을 확인할 수 있으며 암호화 한 후 앞서 암호화 시킨 문자열에 이어 붙이는 것을 확인할 수 있다.
  · Patch/Crack 방법
  ◦ 성공 Routine을 건너뛰는 JMP 명령어(JE Abex_Cra.00403408)를 NOP로 바꿔 성공 Routine을 바로 실행
  ◦ 암호화 규칙(문자 + 0x64)을 이용해 Serial 입력


 - Answer
  · Patch
  ◦ 성공 Routine을 건너뛰는 JMP 명령어(JE Abex_Cra.00403408)를 NOP로 바꿔 성공 Routine을 바로 실행
  ◦ 단, 이 Patch 방법을 사용하면 어떠한 Serial도 성공을 할 수 있지만 위 JMP 명령어만 수정한다면 성공 Message 뒤에 실패 Message도 연이어 출력될 것이다
  ◦ 이는 성공 Message뒤에 따로 Return한다는 명령어가 없기 때문이다.
  ◦ 'JE Abex_Cra.00403408' 지점에서 ZF(Zero Flag)를 0으로 바꿔 실행해도 같은 결과가 나온다.
  · Crack
  ◦ 암호화 규칙(문자 + 0x64)을 이용해 Serial 입력
  ◦ 암호화 과정인 '문자 + 0x64'를 '총 문자열 길이-1'반복하는 Algorithm을 이용해 Crack을 한다.
  ◦ Example
   ▹ abcde → [0x61 + 0x64] [0x62 + 0x64] [0x63 + 0x64] [0x64 + 0x64] = C5C6C7C8
 

'Reversing > Simples Creckme' 카테고리의 다른 글

Simples Crackme 6  (0) 2015.08.16
Simples Crackme 5  (0) 2015.08.16
Simples Crackme 4  (0) 2015.08.16
​Simples Crackme 3  (0) 2015.08.16
Simples Crackme 1  (0) 2015.08.16