실습/[System Hacking 실습]

CrackMe 3번 문제 풀이

환석이 2023. 3. 26. 23:20

최초 프로그램을 실행하면 이런 창이 뜨게 된다.

올바른 값을 넣으면 풀 수 있는 문제 인 것 같다. 

올리디버거로 실행해 보자.

 

먼저 올리디버거로 접근 후 F8을 통해 실행되는 부분까지 가보았다. 

 

0040152B

0040152B에서 실행되는 것을 확인했고, 아까와 같은 창이 떴다. 아무 값이나 입력해 보았다.

 

바로 wrong word!가 뜬 후 종료된다.

 

유일한 단서인 main으로 접근해봤다. 

메인에서 프로그램이 실행되는듯한 함수를 발견했다. 

CreateWindowExA, ShoWWindow, GetMessageA 등등

 

이 후 계속해서 F8로 진행 하였을 시, 

무한루프

무한루프에 빠지는 부분을 발견했다. 

 

여기서 저번에 풀었던 문제와 유사함을 느꼈고,  

GetDlgltemTextA라는 저번문제에서도 풀었던 함수가 똑같이 있었다. 

여기에 BP를 걸고 다시 시도해 보았다. 

 

아무값이나 입력했을떄 , 

 

이 부분에 내가 입력한 값이 쌓이는 것을 확인했다. 

 

이후 쭉 실행해 보았을때, Wrong Word!!!가 나왔다. 

 

다시 이 쪽으로 돌아와서 

어느 부분에서 Wrong word로 가는지 확인을 해봤는데, 004011DE였다. 

어떻게 하면 안 넘어갈 수 있을지 구문들을 해석해봤다. 

먼저 위에서 부터 말을 하면

 

[esp+18]의 값을 EDX 레지스터에 로드한다. --> 내가 입력한 값 

[esp+C]의 값을 EAX 레지스터에 로드한다.  --> infinity 라는 문구 삽입 되는거 확인

이후 push를 통해 스택에 쌓이게 된다.

 

이후 004012D0함수에 접근하게 되는데 , 

00401D0의 함수 내용

요약을 해보면 , ebx exi 에 저장된 값을 각각 dl과 bl에 넘겼을때 , 바이트수가 같으면 eax를 0으로 보내는 함수 같았다. 

 

가설을 근거로 infinity를 입력을 해보았다. 

 

 

EAX값이 0이 되면서 004011DC를 만족해 wrong word!!로 가는 구문으로 향하지 않았다. 

 

계속해서 진행을 해보았다.

maxmin이라는 구문이 뜨면서 종료되었다.