Crackit2.exe 의 flag 를 찾는 것이 목표이다.
기본적으로 프로그램을 실행시켜서 아무 값이나 입력하면 다음과 같다.
Ollydbg를 이용하여 이 프로그램을 열고 "All referenced text string" 창을 열면 다음과 같이 "ACCESS DENIED" 와 "ACCESS GRANTED" 를 찾을 수 있다.
"ACCESS GRANTED" 와 ACCESS DENIED" 분기문으로 갈리는 지점을 찾아가면 다음과 같다.
004027A7 에서 EAX 값을 테스트하여 바로 JNZ 를 통해 분기하는 것을 알 수 있다.
004027A7을 실행하기 직전의 레지스터 값을 보면 다음과 같다.
EAX에 FFFFFFFF가 들어있는데, 위의 분기문에서 "ACCESS DENIED"가 있는 부분으로 점프하지 않고 "ACCESS GRANTED"가 있는 부분으로 넘어가기 위해서는 EAX의 값이 0이 되어야 함을 알 수 있다.
이제 다시 프로그램을 처음부터 실행시켜 보자.
빈칸에 아무 값이나 입력하고 코드 부분을 보면 다음과 같은 내용이 나온다.
004022E4에서 PUSH EAX 을 실행하는데, EAX에는 내가 입력한 값이 들어있었다. 따라서 EAX 값을 스택에 저장한 뒤 MSVBVM60.__vbaLenBstr 함수를 호출하여 입력한 값의 길이를 구하게 된다. 그 값은 다시 EAX에 저장되게 된다. 그 후 004022ED에서 CMP EAX,7 을 실행하는데, 이는 그 길이가 7인지 확인하는 부분이다.
그 밑으로 몇줄 내려오면 다음과 같다.
0040230C 에서 JE 명령어가 나오는데, 이는 CMP EAX,7에서 EAX가 7이 아닐 경우 zero flag가 1이 되기 때문에 점프를 실행하게 된다. EAX가 7이면 바로 다음 줄의 명령을 실행하게 된다.
일단 7이 아닌 크기의 문자열을 입력하여 점프를 실행하면 이 글의 첫 부분에서 말했던 분기점 부분으로 바로 넘어가게 된다.
0040279D에서 "yes"라는 값을 스택에 넣고 vbaStrCmp 함수를 호출한다. 그런데, vbaStrCmp는 스택에 있는 두 개의 값을 불러들여 비교하게 되는데, "yes"가 하나 들어있기 때문에 비교하면 EAX에 FFFFFFFF라는 값이 결과값으로 들어가게 된다. 따라서 바로 "ACCESS DENIED" 부분으로 넘어가게 된다. 즉, 이제 나는 7글자의 문자열을 입력한 뒤 그 문자열을 분석하는 코드를 지나면서 스택에 "yes"가 들어갈 수 있게 하면 된다.
이제 문자열 7개를 분석하는 부분에 초점을 맞춘다. 그 중 어떠한 값을 스택에 넣고 vbaStrCmp를 호출한 뒤 점프를 실행하는 부분을 발견할 수 있다.
그 중 최초로 값을 비교하는 부분에서 스택을 확인하면 내가 입력했던 값이 한 글자씩 차례대로 스택에 저장되어 있음을 확인할 수 있다.
즉, 내가 입력했던 글자 하나하나를 비교하여 틀리면 바로 점프를 통해 넘어가는 코드 내용임을 알 수 있다. 따라서 코드에 나와있는 유니코드에 해당하는 글자 7개가 flag임을 알 수 있다. 그런데 flag에서 4번째와 6번째 문자는 char 형으로 저장되고, 나머지는 유니코드로 저장된다. 따라서 비교할 때도 그렇게 비교하게 되는데, 위에 코드에서 유니코드 부분과 char 부분을 구분할 필요가 있다. 따라서 유니코드를 char로 변환하면 flag가 최종적으로 "Ech3l0n" 임을 알 수 있다.
'WriteUp' 카테고리의 다른 글
| Crackit2.exe Writeup (0) | 2016.01.15 |
|---|---|
| Crackit2.exe Writeup (0) | 2016.01.14 |
| [예시] Easy Keygen (100pt) (0) | 2016.01.11 |