알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

abex crack me2 리버싱 분석 본문

리버싱

abex crack me2 리버싱 분석

백곳 2018. 4. 23. 22:09

abex crack me2 리버싱 분석



일단 abex creak me2 리버싱 분석에 중요한 것은  크랙 파일은 만드는것이 아닙니다. 


어쩌면  jmp 문으로 또는 memory에 있는 unicode 를 보고 정답을 맞출수도 있습니다. 


하지만 기본을 배우는 것이기 때문에 어떻게 돌아가는지에 대해서 탐구해 보겠습니다. 


crackme2.exe

▲ 제가 사용한 파일입니다. 



일단 crackme2 는 visual basic 으로 만들어진 파일입니다. 


일종의 인터프리터 언어로 만들어진 프로그램이죠. 


언어 이후에 가상엔진이 있는 구조 입니다. 


예를 들면 파이썬이나,java 등이 있습니다. 


또한  event driven 방식으로 이벤트 코드에 사용자 코드가 들어가는 구조입니다. 



debug 시 처음 화면입니다. 


F9 로 전진해 보겠습니다. 



전진하다 보면 위와 같은 코드가 나옵니다. 


여기서 ThunRTMain 코드가 나옵니다. 


이 부분이 Visual Basic 의 Main 코드 입니다. 


Visual C++ 에서 


int main(){

return 0

}


와 같은 개념입니다 . 


그런 여기서 볼 부분 visual basic 은 main 코드를 바로 들어가지 않고 


0040123D   .  E8 F0FFFFFF   CALL <JMP.&MSVBVM60.#100>


해당 부분을 실행 시켜 


00401232   $- FF25 A0104000 JMP [<&MSVBVM60.#100>]                   ;  MSVBVM60.ThunRTMain



해당 부분을 들어가서  JMP 를 통해 MAIN 함수로 들어가는것이죠 . 


그럼 들어가 보겠습니다. 




그럼 프로그램이 실행 됩니다. 


그럼 개발자가 작성한 코드는요 ?? 


지금 이순간 찾기 어려운 점은 바로 Event Driven 방식으로 직접 event 를 실행 시켜야 break point 를 걸고 debug 를 할수 있는것이죠. 


그럼 우리는 해당 이벤트 코드가 있을 만한 부분을 메모리에서 찾아 봐야 합니다. 


프로그램에  입력을 하고 Check 버튼을 눌러 보겠습니다. 



자 여기서 그럼 개발자는 자신이 개발한 코드에 the serial is wrong 프로그램 코드에  올릴수 밖에 없습니다 .


그럼 오른쪽 버튼을 눌러  Search for >> All referenced text  을 찾아 보겠습니다. 




그럼 해당 부분에서 찾을수 있습니다. 


그럼 이 부분으로 들어가 보겠습니다. 



자 그럼 어디선가 이벤트 함수 시작 부분이 있겠죠 ?? 


그것은 바로 이전 asm 자료를 보면 함수에 들어 오는 부분은 일반적으로 


00402ED0   > \55            PUSH EBP

00402ED1   .  8BEC          MOV EBP,ESP


같이  EBP 와 ESP 를 이용 합니다. 


그럼 쭉 위로 올라가다 보면 해당 코드가 보입니다. 


이부분이 EVENT 함수의 시작 부분인 것이죠 . 





해당 코드가 나오려면 뭔가 serial 코드와 비교해서 안맞아서 나오는 것이 


문자열을 비교 해서 조건 분기하는 코드 부분이 있을것 입니다. 


그러한 부분이 있는지 쭉쭉 위로 코드를 올리다 보면 



그럼 위와 같이 vbavarTaEq CALL 하고 TEST AX,AX 라는 코드로 AX 레지스터에 0 값이 존재하는 지 체크 하고 

JE 구분으로 조건 분기 합니다. 


그럼 그전에 push edx, push eax 를 통해서  스택에 집어 넣는 버퍼 값이 있는데 저희가 입력한 값인지 살펴 봐야 확실할것 같습니다. 


그럼 CALL 구분 전까지만 프로그램에서 Check 버튼을 눌러서 레지스터 EAX,EDX 의 값을 보겠습니다. 




하지만 저희가 입력한 문자열이 보이지 않습니다. 


그이유는 문자열이기 때문에 보통 객체에 주소값을 넣어 둡니다. 


하지만 위와 같이 보면 참조값을 일일이 찾아가서 보기가 힘듭니다. 


그래서  ollydebug 에서는 



위와 같은 기능이 있습니다. 


참조 값을 보여 주는 것이죠 . 




제가 입력한 값이 


0x02547f1c 에 있네요 .


꺼구로 읽어야 합니다.  에디안 타입 때문에요 .. 


이번에는 EDX 를 보겠습니다. 




이번에는 비교할 문자열에 serial key 값이 보이네요 


해당 값과 비교 하여 JE 를 통해여 분기를 하는것이 였네요 


해당 시디키를 맞춰 입력 하면 성공했다고 메세지를 뛰울 것입니다. 


그럼 이번에는 해당 이벤트의 처음으로 올라서 어떻게 암호화를 하는것일까요 ?? 


일반적으로 암화화는 입력한 문자열을 반복문으로 돌리면서 해당 키값을 생성 합니다. 



push ebp

move ebp,esp 


을 찾고 그다음 으로 FOR 문이 있는지 찾아 보겠습니다. 


쭉쭉 코드를 F8 로 실행 하다 보면 


그럼 보면  vbBarForint 함수에 들어가기 전에 



00403173   .  89BD 24FFFFFF MOV [EBP-DC],EDI

00403179   .  899D 1CFFFFFF MOV [EBP-E4],EBX

0040317F   .  89BD 14FFFFFF MOV [EBP-EC],EDI

00403185   .  89BD 04FFFFFF MOV [EBP-FC],EDI


으로 스택 값을 바꾸는데요 


거기에서 EBX 를 잘보면 4 라는 값이 들어 있는데 


분위기상 반복 횟수로 생각이 됩니다. 




for 문이 ASM 으로 실행 되는건 위에 코드로 보면 TEST EAX,EAX 로 EAX가 0인지 체크 하는 부분에 있습니다. 


EAX가 0이면 


체크해서 JE 로 loop 를 빠져 나가는것이죠. 


그럼 해당 Loop 문 안에 



vnStraVarval 은 입력한 값을 취득하는 함수 입니다. 


그래서 함수 실행 끝나고 EAX 로 결과값을 받아 보면 


제가 입력한 글자를 1개식 가져오는것을  알수 있습니다. 


그리고 rtcAnslvalueBstr 은 ASCII 코드를 UNICODE 로 바꾸는 API 입니다. 


그리고 그밑에 코드등을 통해 총4번의 반복문을 통해서 암호화을 합니다. 


해당 암호화를 통해 결국엔 처음에 봤던 



위와 같이 암호 코드가 저장되어지는 코드가 있는것이죠 .



이상입니다. 


리버싱 자료 정리는 컴퓨터 기본 지식 을 너무 많이 요구해서 설명 하면서도 풀어내기 어려운 부분이 많네요 .. 


이해 않가는 부분이 많을수도 있습니다. 


대표적으로 ASM 에 나오는 API 의미를 어떻게 알았을까 ?? 


이것은 저도 Google 에서 찾아보고 알아내는것입니다. 


리버싱의 길은 쉽지만은 않은것 같습니다. 



Comments