먼저 L03 문제를 살펴보겠습니다.
프로그램 자체는 굉장히 단순한 키젠미 파일로Name과 Serial을 입력한 후 Check를 눌렀을때 Serial이 맞으면 성공한다는 메시지가 뜨게 되고 Serial이 맞지 않으면 실패했다는 메시지가 뜨게 되는 프로그램입니다.
문제에서 원하는대로 Name이 CodeEngn일때 Serial을 구하면 되겠네요.
그래서 평소 크랙미파일을 풀때처럼 back to user mode를 통해서 에러메시지창을 잡아내시던가 혹은 오른쪽클릭-Search for-All referenced text strings를 통해서 You failed란 문자열을 출력하는 코드로 넘어오시면 됩니다.
이때 맨 위부터 파란색박스를 보면
00401113 PUSH 03.00403238
00401118 PUSH 3EC
0040111D PUSH DWORD PTR SS:[EBP+8]
00401120 CALL <JMP.&user32.GetDlgItemTextA>
00401125 CMP EAX,3
00401128 JNB SHORT 03.00401142
이 부분은 먼저 Name에 대한 값을 입력받는 부분입니다.
00401120주소에서 GetDlgItemTextA함수를 통해 Name을 입력받고 Name이 3글자보다 같거나 크지 않으면 실패메시지를 띄우게 됩니다.
두번째 파란색박스를 보겠습니다.
00401153 PUSH 20
00401155 PUSH 03.00403264
0040115A PUSH 3ED
0040115F PUSH DWORD PTR SS:[EBP+8]
00401162 CALL <JMP.&user32.GetDlgItemTextA>
이 부분은 Name을 받고 난 나머지 Serial에 대한 입력을 처리하는 부분입니다.
세번째 파란색박스를 보겠습니다.
0040118C PUSH 03.00403264
00401191 PUSH 03.00403284
00401196 CALL <JMP.&kernel32.lstrcmpA>
0040118C에서는 00403264주소에 입력된 사용자가 입력한 Serial을 PUSH합니다
00401191에서는 00403284주소에 입력된 알고리즘을 통해 만들어진 Serial을 PUSH하고
00401196에서 이 두 Serial값이 일치하는지 lstrcmpA함수를 통해 알아보게 됩니다.
그래서 답은 00401191주소에 있는 값이 됩니다.
하지만 이렇게 해서는 리버싱실력이 많이 늘지 않기때문에 직접 어떤 알고리즘을 통해서 시리얼을 만드는 지를 알아보겠습니다.
먼저 키젠 알고리즘을 볼때 좀더 편리하게 보기 위해 Name이 담겨져 있는 주소를 CodeEngn으로, KeyGen하는 함수의 주소를 KeyGen으로 바꾸겠습니다.
#플러그인으로는 Ezbeat분이 만드신 OllyRename플러그인을 사용했습니다.
#올리디버거가 아니라 IDA를 사용하시는 분이시라면 플러그인 없이 사용하실 수 있습니다.
KeyGen함수 안쪽으로 들어가게 되면 긴 코드중에 위와 같이 3개의 루프가 보이게 됩니다.
모두다 주소값만 다르고 알고리즘 자체는 같은데 먼저 DL을 [ECX+EBX]의 값으로 바꾼다음 DL과 어떤 숫자를 xor시킨 다음 그것을 다시 [EAX]에 옮기는 알고리즘입니다. 루프의 횟수는 각각 1C,13,11번이 됩니다.
이때 맨 위에 브레이크포인트를 건곳에서 BT DWORD PTR DS:[403000],1이란 어셈블리어가 있는데 이 결과에 따라서 그 밑에 jmp구문을 통해 어떤 값으로 초기값을 할지 결정됩니다.
그 다음으로는 중간에 브포를 건데처럼 [eax]와 0과 비교를 해서 조건에 맞기 전까지 계속 KeyGen함수를 재귀시킵니다.
원래라면 직접 프로그램을 짜서 name을 넣으면 serial값을 추출해 내는 keygen프로그램을 만들고 싶었는데,
중간에 BT라는 어셈블리어가 어떤 뜻인지를 몰라서 C언어로 만들어내질 못해서 프로그램을 짜지 못했습니다.
나중에 좀더 bt에 대해서 연구를 해보다가 어떤 뜻인지를 알게 되면 프로그램을 짜보겠습니다.
'리버스엔지니어링 > 크랙미 풀이' 카테고리의 다른 글
CodeEngn Advanced RCE L10 분석 (4) | 2015.01.07 |
---|---|
CodeEngn Basic RCE 끝! (1) | 2014.12.19 |
Junior CTF Level2 (0) | 2013.07.29 |
CodeEngn Basic RCE L06 문제 풀이 (0) | 2013.03.16 |
코드게이트 2013 바이너리 100분석 (0) | 2013.03.12 |