안녕하세요. 오늘은 Advance RCE level 2를 풀어보겠습니다. 홈페이지로 들어가 파일을 받아주세요

정답을 찾으라는 군요. 파일을 실행해봅시다.

패스워드입력창이 떴습니다. 아무거나 입력하고 엔터를 누르니 프로그램이 종료되는군요. 일단 PE로 분석을 해봅시다.

패킹은 안되어있으며 C++로 만들어졌다고 합니다. 올리디버그로 열어봅시다. 열었으면 우리가 아까 파일을 실행했을 때 본 문구열을 찾아봅시다. 오른쪽마우스 - Search for - All referenced text strings을 눌러주세요.

문자열을 찾아봅시다.

실행했을 때 본 문자열이 나와있습니다. 해당 주소로 진입해봅시다.

진입한 후 한줄씩 실행해보니 Enter Password: 를 출력하고 004012D2에서 사용자의 입력값을 받는 것을 알 수 있습니다. 계속 코드를 실행해 봅시다.

하나의 루프를 거치고 004013C5에서 CALL EDX를 호출하여 프로그램을 종료하고 있있음을 알아냈습니다. F7키를 이용하여 진입해봅시다.

코드를 한줄 씩 실행하다보면 CMP를 이용해 ECX와 특정 값들을 비교하고 있음을 알 수 있습니다. CMP부문으로 간 뒤 ECX값을 확인해봅시다.

EAX는 우리가 입력한 시리얼값이고 ECX는 41이군요. 이 41과 43을 비교한다고 나와있습니다. 비교해서 ZF가 0이면 JNZ에 의해 18FF8A로 점프하게 되고 18FF8A로 가면

사진에 나와있듯이 ECX를 호출하게 되고 프로그램이 종료되어 버립니다. 계속 분석해봅시다.

코드를 밑으로 내려보면 위와 같은 코드가 보입니다.

57 45 4C 4C 20 44 4F 4E 45 21을 차례대로 넣는 군요.  아스키코드로 확인해봅시다.

W E L L 스페이스바 D O N E ! 이네요. WELL DONE!

아무래도 성공문자열인것 같습니다. 그렇다면 이 코드를 실행할 수 있도록 해줄 필요가 있습니다. 일단 코드를 처음부터 다시 봅시다.

밑 부분의 코드를 보시면 JE SHORT 0018F839가 나옵니다. 이 0018F839는 어디일까요?

성공문자열을 만드는 부분입니다. 즉 우리는 JE SHORT 0018F839에서 점프를 해야 합니다. 앞의 비교문은 TEST인데 일단 잠시 미뤄두고 앞의 CMP들부터 해결해봅시다.

첫번째 CMP는 ECX와 43을 비교합니다. 그런데 여기서 ECX의 값은 41입니다. 41을 아스키값으로 바꾸면 A입니다. 즉 우리가 입력한 A12의 첫번째 값이지요. 즉 우리가 입력한 패스워드의 첫번째 글자와 43을 비교하는 것입니다. 확인을 위해 ECX를 43으로 수정하고 실행해봅시다.

두번째 CMP에 걸렸을 때의 ECX값입니다. ECX와 52를 비교하는 곳이지요. 여기서 ECX는 31. 아스키 값으로 1입니다. 그렇다면 우리가 입력한 값을 처음부터 끝까지 비교하는 것을 알 수 있습니다. CMP로 비교하는 구문은 총 10개. 각각의 값은

43 52 41 41 41 43 4B 45 44 21입니다. 아스키값으로 바꾸면

CRAAACKED!입니다. 즉 입력한 값과 CRAAACKED!를 비교하는 것이군요. 패스워드에 한번 CRAAACKED!를 입력해봅시다.

WELL DONE!이란 창이 뜨는 것을 볼 수 있습니다. 패스워드는 CRAAACKED!이네요.

인증해봅시다.

네 이것으로 문제풀이를 마치겠습니다.

 

 

 

 

 

 

 

'codeengn' 카테고리의 다른 글

codeengn - Advance RCE level 4  (0) 2016.08.07
codeengn - Advance RCE level 3  (0) 2016.08.07
codeengn - Advance RCE level 2  (0) 2016.08.03
codeengn - Advance RCE level 1  (0) 2016.08.03
codeengn - basic rce level 6  (0) 2016.08.02
codeengn - basic rce level 5  (0) 2016.08.02
Posted by englishmath