문제를 클릭하면 Easy_CrackMe.exe 라는 exe 파일 하나를 받을 수 있다.

다운로드 받은 파일을 실행해보면 아래와 같은 GUI 프로그램이 실행되는 것을 볼 수 있다. 문자열을 입력 후 확인 버튼을 누르면 Incorrect Password 라는 결과창을 보여준다. 이를 통해, 본 프로그램에서 "Incorrect password"라는 문자열이 쓰인다는 것을 알 수 있다.

 

이번에는 x32dbg를 사용하여 파일을 로드하고 실행하여 EntryPoint를 찾는다.

이 상태에서 문자열 검색을 누르면 아까 보았던 Incorrect Password 문자열을 볼 수 있고, 그 위쪽으로 Congratulation !! 이라는 문자열을 볼 수 있다. 올바른 비밀번호를 입력하면 이 문자열이 출력되는 것으로 추정된다.

 

임의의 문자열을 입력하게 되면 아래 부분으로 실행 지점이 이동하게 되며, 코드의 하단에서 성공 문자열도 볼 수 있다.

성공 문자열까지 무사히 실행 흐름을 유지하기 위해서 어떤 과정을 거치는지 살펴봐야겠다.

 

잘못된 문자열에 의해 실패 지점으로 가는 첫번째 분기문은 0x004010B5 지점이다.

이 위치에서 성공과 실패를 가르는 첫번째 조건은 byte ptr ss:[esp+5]61('a') 가 같아야 한다는 것이다.

byte ptr ss:[esp+5] 가 어떤 값을 가지는지를 보기 위해 esp가 가리키고 있는 콜스택의 값을 확인한다.

테스트로 입력해둔 값은 'aaaa' 인데, 마치 입력한 값을 가리키듯 스택에 들어있는 값 또한 61 61 61 61 (aaaa)을 가진다.

그리고 여기서 esp+5가 가리키는 값은 두번째 입력된 'a'가 된다.

이 값이 61인 a와 같아야 한다니, 정답인 password의 두번째 글자가 'a' 인 것을 알 수 있다.

 

다음으로, 두번째 분기문을 만나게 되는 지점은 0x004010CD 이다.

이 위치에서 성공과 실패를 가르는 기준은 eax의 값이 0이어야 한다는 것이다. (바로 윗 줄의 test eax, eax 때문에)

여기서 eax의 값은 0x004010C3에서 호출되는 easy_crackme.401150 의 return 값과 같게 된다. 그렇기 때문에 호출되는 함수가 어떤 결과를 반환하는지 알아야 한다. 이를 위해 우선 인자로 들어가는 값을 보자. 함수가 호출되기 직전에 스택에 push 되는 두 값이 있다. 하나는 프로그램 내에 하드코딩 되어 있는 문자열 "5y"이고, 다른 하나는 입력한 문자열인 dword ptr ss:[esp+A] 이다. esp+A가 가리키고 있는 값이 무엇인지 확인하기 위해 콜스택을 확인해도 되지만 이번에는 이 값이 ecx에 들어있으므로, ecx에 저장된 값을 통해 확인한다.

그러면, 그 값이 "aa"임을 알 수 있다. 그러나 앞서 테스트값 4글자가 모두 a 였으므로, 어느 자리의 a를 가리키는지 모호하여 서로 다른 글자를 가지는 테스트데이터 "!abc"를 사용하겠다.

이를 사용하여 다시 확인한 결과, 세번째와 네번째 자리의 문자인 "bc"가 ecx의 값이 되는 것을 알 수 있다. 

easy_crackme.401150 함수의 심볼이 혹시나 있는지 보기 위해 IDA를 사용하여 이 함수가 위치한 0x004010C3 주소로 이동하면 문자열의 일치 여부를 확인하는 함수인 strncmp임을 알 수 있다. 따라서 앞서 사용된 두 매개변수와 함께 고려하여 생각해볼 경우, 두 번째 분기문의 조건은 입력된 비밀번호의 3번째와 4번째 문자가 "5y"와 같아야만 함을 나타내는 것을 알 수 있다.

이제까지 알아낸 정보를 가지고 조합한 패스워드는 _a5y__ 이다. 이를 고려하여 !a5yasdf 라는 테스트데이터로 다시 이어서 테스트를 하였다.

이후 3번째 만나는 구간부터는 하드코딩 되어 있는 R3versing 이라는 문자열과 입력된 문자열 중 5번째에 위치한 문자열 전체를 한글자씩 비교하여, 같은지 아닌지 살핀다. 언제라도 다른 문자열을 발견할 경우 실패 지점으로 분기된다. 그렇기 때문에 5번째부터는 R3versing 이라는 문자열을 입력하는 것이 실패로 가지 않는 길이다.

 

현재까지 조합된 패스워드는 _a5yR3versing 이다. 첫번째 자리의 문자가 미정인 상태이다. 이를 확정짓기 위해서는 네번째 분기 지점인 0x00401112를 확인하면 된다.

그리고 이 곳에서 첫번째 자리 문자를 가리키는 esp+4의 값이 45('E')와 같은지 비교한다. 이것으로 첫번째 자리 문자가 'E'임을 알 수 있다.

 

결과적으로, 이것들을 조합한 패스워드인 Ea5yR3versing을 입력하면 다음과 같은 축하 메세지를 얻을 수 있다.

+ Recent posts