abex' crackme #2
분석하기 전에 실행을 해보자.
Name과 Serial을 입력하는 칸이 있고 Check 버튼이 있다.
Name과 Serial을 올바르게 입력하고 Check를 누르면 풀리는 문제일거 같다.
Name과 Serial에 아무런 문자열을 넣고 Check를 누르니 Name을 4글자 이상으로 입력해달라고 나온다.
흠.. 틀렸다고 나온다.. OllyDbg를 실행시켜 분석을 시작해보자.
401E14를 PUSH하고 401232:ThunRTMain()을 호출하게 된다.
401E14의 메모리다.
RT_MainStruct 구조체이고, ThunRTMain의 인자로 프로그램 실행에 필요한 구조체 정보가 담겨있다.
CALL 00401232 이후 00401232를 보면 JMP [4010A0]으로 되어 있다. (간접호출 기법)
문제를 풀기위해서 분석해야 할 부분은 ThunRTMain이 아닌 Name과 Serial을 입력하고 Check 하는 부분이다..
Code 영역 우클릭 → Search for → All referenced text strings 클릭
밑으로 내리면 맨 처음 실행했을 때 보았던 문자열들을 볼 수 있다. (더블클릭을 하면 해당 위치로 갈 수 있다.)
"Wrong serial!" 부분을 확인하면 위에서 분기되어 403408로 넘어오고 "Wrong serial!"이 실행되는 것을 확인할 수 있다.
위로 올려보면 403332에서 분기되어 "Wrong serial!" 부분으로 넘어간다.
만약 403332에서 분기가 안된다면 "Congratulations!" 부분이 실행된다.
* TEST AX, AX : AX가 0인지 확인하는 구문, AX가 0이면 ZF=1로 세팅되어 JE에서 점프
현재 403329 부분이 어떤 함수 인지 모르기 때문에 403329에 BP(Break Point)를 설정하고 디버깅을 진행한다.
EAX[19F1BC], EDX[19F1AC]로 되어있다.
Stack 부분을 확인하면 실제 Serial과 내가 입력한 Serial이 인자로 넘어가는 것을 알 수 있다.
Serial에 B2C5D2CB를 입력하고 Check를 클릭하자.
"Yep, this key is right!" 문구가 출력되었다.
이제 Serial 생성 알고리즘을 확인해보자.
Serial 생성 알고리즘을 확인하기 위해 함수의 시작 부분을 찾아야 한다.
PUSH EBP
MOV EBP, ESP
Stack Frame의 시작부분의 코드를 찾았다. 402ED0에 BP를 걸고 디버깅을 시작하자.
402F98을 실행하면 EBP-88부분에 Name이 쌓이게 된다.
402F98 내부에서 Name을 가져오는 것으로 추측할 수 있다.
4031F7 부분에서 내가 입력한 Name(NangLam)의 첫 글자인 N을 Hex값(4E)으로 가져오는 것을 알 수 있다.
40323D 부분까지 실행하고 나서의 레지스터이다.
EAX, ECX, EDX의 부분이다. 이렇게 인자가 들어가게 되고 403243을 실행하게 되면
4E + 64 = B2의 값이 EDX에 저장이 된다.
이후 40327B에서 만들어진 문자열들을 이어 붙이는 역할을 한다.
이 부분을 3번 더 반복하여 Serial인 B2C5D2CB 가 만들어진다.
'Security_ > Reversing' 카테고리의 다른 글
[풀이] abex' crackme #3 (0) | 2021.09.16 |
---|---|
[정리] 함수 호출 규약 cdecl, stdcall, fastcall (0) | 2021.09.16 |
[풀이] abex' crackme #1 (2) | 2021.09.15 |
[Themida / WinLicense] OllyDbg 오류 해결 정리! (0) | 2021.09.14 |
[Reversing] Radare2 설치 및 사용 방법 총 정리 [예제 포함] (0) | 2021.08.05 |
댓글