ZER0 D0G의 잡동사니 블로그

Abex_crackme#2 crack 하기 본문

해킹/리버띵

Abex_crackme#2 crack 하기

ZER0 D0G 2022. 4. 14. 16:37

1)    Abex crackme2 serial key crack

ThunRTmain

리버싱을 하기위해 exe파일을 디버거로 열면 crackme2의 시작부분 세줄이 나타납니다.

ThunRTMain은 일단 두고 필요한 함수로 바로 이동해봤습니다.

 

string

모든 소스에 참조되어있는 유니코드 스트링 문자열을 긁어와 분기점이 있을 가능성이 가장 높은 “Congratulations!”(0040337E)로 들어가줍니다.

우와~

그런 문자열 근처에 있는 소스를 찾아보면 위 함수 vbaVarTstEq라고 하는 대놓고 조건문인 함수를 발견 할 수 있다.

위 소스의

LEA EDX, DWORD PTR SS:[EBP-44]LEA EAX, DWORD PTR SS:[EBP-34]는 함수 CALL 앞에 있으므로 스택에 들어가 있는(SSStack Segment의 줄임말 이기에) EDX, EAX 인자를 vbaVarTstEq에게 넘겨주기 위함임을 추측 할 수 있다.

위 사진 처럼 두 명령어에 BP를 걸고 실행 시켜준뒤 입력해본다.

빙고!

그런 후 스택 데이터를 보여주는 창에서 EBP-44EBP-34 스택에 저장 되어있는 C8C5CCD3(암호화된 시리얼키)1234a(내가 입력한 틀린 시리얼키)가 스택에 저장되어 있는 모습을 볼 수 있다.

 

(추가로 저는 스택에 저장되어 있는 데이터를 보며 왜 직접적인 주소는 000…8만 들어있는지 의아했습니다. 그래서 이 뒤에 VB의 변수, 구조체 멤버 추가 과정을 보니 일반적인C와는 다르다는 것을 알았습니다. 8과19F244와 같은 데이터 값은 아마 리턴 할 노드의 주소라고 추측했습니다. 이부분도 이후에 VB의 변수 저장 구조를 한번 알아볼까합니다.)

 

그래서 여기서 나온 C8C5CCD3를 내가 찾은 시리얼 키에 넣어보면?

 

맞췄다~! 만세

~ 시리얼키가 맞다고 뜨게 됩니다.

 

그런데 과연 이 시리얼키는 어떻게 생성되었을까요?

의심된다 의심돼!

(작업 하던중 환경이 변해서 색이 다른점 유의 해주시기 바랍니다)

먼저 저는 시리얼 생성 알고리즘은 입력 받은 이름에 있다고 가정 후, 가장 입력 함수에 가까운 입력된 문자열의 길이를 검사하는 함수로 왔습니다.

 

빨간 동그라미 집중!

그리고 계속 디버깅하던 중 vbaLenVAR라고 하는 함수를 발견했습니다! 이는 분명 문자열 길이에 관한 값을 리턴할것이라 가정 후 위쪽을 분석하던 중 MOV EBX, 4라는 것을 발견했습니다. 이때 저는 이전에 파이썬으로 간단한 고대 암호(카이사르 암호)를 구현 했던 경험이 생각나 암호화를 하기 위해서는 평문의 문자열의 인덱스만큼 반복문을 사용했던것을 떠올렸고 이 프로그램 또한 다를거 없이 같을거라 추측했습니다.

 

LET'S GET CERTITUDE!

그래서 위의 EBX에 저장된 4는 문자열의 길이이고 암호화에 사용 할 것이라 생각되어 생각에 확신을 더하기 위해 값을 5로 바꾼 후 다른 값을 입력해 실행시켜 보았습니다.

 

영화 아일랜드의 한장면이다.

(혹시 몰라 패치를 한 상태로 진행 하였습니다~)

 

값을 넣고 실행 시키니

 

 

역시 EBX의 값인 5만큼 루프하여 기존 시리얼키 dahoC8C5CCD3뒤에 추가로 입력해둔 A가 추가되어 C8C5CCD3A5라는 값을 얻을 수 있었습니다!

 

해냈다 해냈어 다호가 해냈어~

 

이를 입력하고 Check를 눌러보니 정상적으로 실행되는 모습을 볼 수 있었습니다.

 

Comments