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 |