choideu 2022. 3. 20. 12:43

abex' crackme는 #1과 다르게 Name과 Serial을 입력으로 받고 있습니다. 

그럼 이번 목표는 올바른 serial key를 찾는 것이 되겠습니다.

(Name을 입력받기 때문에 Serial Key와 Name 사이 어떤 connection이 있는 것 같습니다.)

EP는 00401238입니다.

PUSH 00401E14를 하고 있는데 이것은 위에서 쓰인 ThunRTMain()의 parameter가 될  RT_Main Struct의 주소입니다.

그리고 CALL로 00401232를 호출하고 00401232에서 ThunRTMain을 부르고 있습니다. 한번에 CALL로 ThunRTMain을 불러도 되는데 여기서는 굳이 한 번 거쳐서 함수를 호출하고 있습니다. 이걸 바로 Indirect call이라고 부릅니다.

 

F7키를 눌러 00401232를 실행하면 메모리 주소의 영역대가 완전히 달라진 것을 확인할 수 있습니다. 이 말은 즉 dll 모듈 주소의 영역이라는 말이고, 여기서 굳이 이 영역을 분석할 필요가 없어집니다.

 

더 분석을 하기 전에 앞서 필요한 선행 지식이 있습니다. 이 파일은 GUI programming에 자주 쓰이는 VB로 제작되었고, VB 프로그램은 Windows OS의 event driven 방식으로 동작한다는 것입니다.

(=main함수가 아닌 각 event handler에 사용자 코드가 존재할 것이고 [check] button handler에 사용자코드가 있을 것임)

//사용자 코드 = 우리가 디버깅을 원하는 코드

[Search] -> All referenced text strings를 눌러줍니다.

Key point, error message box와 그 문자열을 이용하는 것

스크롤을 내리면 4문장의 strings를 발견할 수 있는데요 문장을 읽어보면 check 버튼을 눌렀을 때 입력키 == serial key분기문에 따라 True/False 문장이 실행되는 결과인 것을 알 수 있습니다. 저 주소를 따라 올라가면 그 위에 우리가 원하는 분기문을 찾을 수 있을 것입니다.

 

00403332의 JE가 결과에 따라서 True문을 실행할 것인지, False문을 실행할 것인지 정하는 조건 분기입니다.

그 위에는 CALL ~ vbaVarTstEq()함수를 호출합니다. 구글링해보면 이 함수는 문자열 비교 함수입니다.(함수이름에서도 추측가능함). input value랑 serial key를 비교하는 함수일 것입니다. 그렇다면 그 위의 PUSH EDX, PUSH EAX는 이 함수의 매개변수일 것이므로 둘 중 하나가 serial key입니다.(위가 LEA 명령어이기 때문에 정확히는 문자열을 가리키는 주소일 것입니다.)

break point를 걸어놓고 실행해보자

code window / register window
stack window

EDX, EAX 값을 확인할 수 있다. 

stack window에서 값을 클릭하고 follow in dump를 클릭한다.

이 부분이 다르다. 지금은 ascii code로 되어있기 때문에 long->unicode로 변환시킨다.(ascii도 상관 x)

그럼 c4가 EDX였는데 EDX가 serial key의 주소였다. serial key는 바로 "95969798"

 

right

crack이 완료되었다.