본문 바로가기

리버스-엔지니어링

[Reversing.kr] Easy CrackMe

반응형



해당 프로그램의 패스워드 인증키가 무엇인지 알아내야한다.


All referenced text strings로 패스워드 인증과 관련된 문자열이 정의된 곳은 금방 찾을 수 있다.



분기문을 찾아 코드 윗 부분으로 올라가면 아래 코드를 만나게 된다.



GetDigItemTextA는 아까 보았던 대화상자에서 문자열을 획득하는 API이다.
(필자는 패스워드를 asda로 인증 요청 후 디버깅을 진행한다)

분기 조건문(CMP)을 해석했을 때 현재 ESP는 12FA14이므로 5를 더하면 12FA19이다.
해당 위치에 있던 값을 변수값 출력창으로 확인해본다.



메시지창에서 입력한 두 번째 문자를 가져오고 있다.
패스워드 두 번째 글자와 아스키코드 61('a')가 같으면 다음 코드로 분기하게 된다.
따라서 프로그램을 재실행한뒤 두 번째 자리 패스워드를 'a'로 만든다.



이후 디버깅해보면 첫 번째 로직을 통과하게 된다.
다음 로직은 입력받은 문자열을 세 글자부터 가져온다. 즉, 앞에 입력한 두 글자("ba")는 포함되지 않는다.



401150 함수 내부를 분석해보면 아래와 같이 입력받은 패스워드를 EDI에 저장하고
아까 함수 실행 전 스택에 넣었던 "5y"라는 문자열을 ESI에 저장한다.



REPE CMPS(반복비교)의 ECX가 2이므로 맨 앞의 패스워드 두 글자와 "5y"를 비교한다.
따라서 패스워드 "banana1234"에서 "ba"를 제외한 앞의 두 글자인 "na" 대신 "5y"로 입력하면 통과된다. 
["ba5yna1234"]

그 다음 분기문은 아래 코드와 같다.



반복문 진입전에 "R3versing"이라는 문자열을 ESI에 저장하고
패스워드 4자리 이후 값을 EAX에 저장한다.

그리고 각각을 BL과 DL로 초기화하여 비교한다. 


문자가 서로 일치하지 않으면 인증 실패 로직으로 건너뛴다.

따라서 패스워드의 5자리부터는 "R3versing"이 들어가야 한다는 것을 확인했다.
이제 ["ba5yR3versing"]을 입력하여 디버깅한다.

이전 반복문이 끝난 이후 네 번째 분기문으로 가보면
패스워드 맨 앞 글자를 '아스키 코드 0x45('E')와 비교하고 있다.
문자가 다르면 인증 실패 분기점으로 이동한다.




따라서 문자열 맨 앞에 'E'가 존재해야한다.
즉, 시리얼 키는 ["Ea5yR3versing"]이다.



반응형