한줄 한줄 StubCode를 트레이싱해서 넘어가면 


CALL 401000 명령으로 메인 함수를 호출한다.




내부로 들어가면 입력을 받을 수 있는 DialogBox가 뜨고 


이 때부터 이벤트 핸들러에 BP를 걸어서 디버깅을 진행하면 된다. 


처음에 Easy CrackMe를 실행했을 때 작동하는 API를 유추해서 


MessageBox 에 BP를 거는 것도 좋은 방법이다. 





ollydbg 의 name in module 


에서 messagebox를 찾아보면 코드에서 호출하는 MessageBoxA 함수가 보인다. 


엔터를 쳐보면 어느주소에서 호출하는지 나오는데 모두 BP를 걸면 되겠다. 


그리고 아무값이나 입력해보면 해당 이벤트 핸들러에서 정지! 


이제부터 이 이벤트핸들러를 분석하면 password를 찾아낼 수 있다. 





이벤트 핸들러를 보면 GetDlgItemTextA 를 이용해서 어느곳에선가 문자열을 읽어오고 있다.






 

GetDlgItemTextA가 호출되면 우리가 입력한 값으로 버퍼에 데이터가 채워진다. 


이 CrackMe는 이렇게 우리가 입력한 문자열과 내부 문자열을 비교하는 프로그램 같다.


GetDlgItemTextA API의 바로 밑을 보자 


CMP BYTE PTR SS:[ESP+5],61


명령어가 있다. ESP+5의 값과 61(a)를 비교하고 있는데 


ESP+5는 바로 우리가 입력한 버퍼의 2번째 데이터이다. Index(1) 


즉, 2번째 데이터가 a 인지 검사하고 있다. 만약 여기서 a가 아니라면 Zero Flag 가 0이되고 

그 밑에 오는 JNZ명령에 의해 비밀번호가 틀렸다는 MessageBoxA로 흐름이 넘어가 버린다. 


값을 다시 입력해서 2번째에 a가 오도록 아무값이나 입력하고 이 루틴을 넘어가보자. 

(메모리를 고쳐서 넘어가도 된다.) 


그 다음에 등장하는 5y  문자.




ECX에 우리가 입력한 3번째 값부터 나머지값을 넣고 

5y라는 문자열과 함께 CALL 401150 서브루틴 함수를 호출하고있다. 

이 함수 내부를 따라들어가면 우리가 입력한 버퍼의 3번째값부터 

5y 문자열을 1byte씩 비교한다. 


두번째,

3,4번째 문자를 5y로 변경하라. 


알아낸 정보 


?a5y??????


이제 거의 다왔다. 


R3versing이라는 문자열의 등장. 


언뜻보기엔 이녀석이 패스워드같다. 


하지만 아니다, 조금 더 파헤쳐보자 





가장 중요한 루틴이다. 


우선 EAX에 우리가 입력한 버퍼의 Index(4)의 값을 대입한다. 


즉 ?a5y를 입력했다면 이 부분엔 아직 데이터가 없다. 


?a5y???? 입력했다면 ????4개가 들어가있었을터. 


이 루틴은 반복문인데 1번 반복할때 우리가 입력한 버퍼와 

R3versing 문자열이 들어있는 ESI값을 

1BYTE씩 계속 비교한다. 


이 값 역시 완전히 일치해야한다. 

여기까지 진행하면 우리가 얻은 데이터는 이러하다 


?a5yR3versing 


거의 다왔다. 


이제 앞의 ?값이 무엇인지만 알아내면 된다. 





바로 이 부분! 


ESP+4 와 45를 비교하고있다. 


직접 스택을 확인하면 알겠지만 저건 우리가 입력한 버퍼의 시작주소이다. 

즉 첫번째 바이트의 주소이다. 

그 바이트부분이 45인지 검사하고 있다. 


45는 E


Clear.

 



'취미 > WarGame' 카테고리의 다른 글

[reversing.kr] ImagePrc  (0) 2015.02.21
[reversing.kr] Position  (0) 2013.10.30
[reversing.kr] replace  (0) 2013.10.25
[reversing.kr] Easy_UnpackMe  (0) 2013.10.24
[reversing.kr] 2번 문제 Easy_keygen  (0) 2013.10.23
Posted by $Zero
: