abex' crackme #2 분석(1)
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를 걸어놓고 실행해보자
EDX, EAX 값을 확인할 수 있다.
stack window에서 값을 클릭하고 follow in dump를 클릭한다.
이 부분이 다르다. 지금은 ascii code로 되어있기 때문에 long->unicode로 변환시킨다.(ascii도 상관 x)
그럼 c4가 EDX였는데 EDX가 serial key의 주소였다. serial key는 바로 "95969798"
crack이 완료되었다.