본문 바로가기

【 리버싱 】/[ CodeEngn ] Basic RCE 문제 풀이

[ CodeEngn ] Basic RCE 3 문제 풀이

URL : https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com

3번 문제이고 밑 파일을 다운로드해서  압축을 풀어주자
그러면 이렇게 실행파일이 하나가 보인다.

실행시켜보면

말 그대로 'MSVBVM50.DLL' 가 없다는 뜻이다.

그러면 'MSVBVM50.DLL'를 다운로드해줄 필요가 있다.

Download : https://ko.dll-files.com/msvbvm50.dll.html

다운로드 버튼을 누르고 압축 해제하자.

그러면 3개의 파일이 보이는데 .DLL 파일 빼고 다른 건 현재 문제 푸는 데에는 필요가 없다.

.DLL 파일을 드래그 앤 드롭으로 03.exe가 있는 데에 넣어주자.

 

그러면 03.exe 파일을 실행시켜주자

그러면 아까와 다른 메시지가 뜨는 걸 확인할 수 있다.

 

변역하면 "이 잔소리를 제거하거나 올바른 암호를 얻으십시오!" 라는 뜻이다. (왜 독일어로 되어있지..?)

 

확인을 누르자

그러면 아까 창을 제거하거나 요기 Regcode 암호를 얻으라는 말이다.

우리는 함수 이름을  찾아내는 것이기  때문에 창 제거는 제외하자

아무거나 넣으면 이렇게 "오류! 비밀번호가 틀립니다!" 라는 메시지가 나온다.

 

자 이제 OllyDbg 도구를 이용해서 뜯어보자!

뜯어보면 저번의 문제 1,2번이랑 다르게 시작 지점이 이상하다.

 

문제를 보면 스트링 비교 함수 이름을 찾아보라고 한다.

 

따라서 우린 비교하는 함수를 찾을 필요가 있다.

 

어셈블리코드 창에다가 우클릭 -> Search for -> All intermodular calls 를 클릭 해준다.

그럼 이렇게 많은 함수들이 보이게 되고 이 중에서 비교 함수 이름을 찾으면 된다.

어떻게 찾냐고?

 

저번에 문제 1번에서 CMP가 무엇을 뜻하는지 아는 사람은 쉽게 뭘 찾아야 할지 알 수 있을 것이다.

까먹으신 분들을 위해 다시 한번 말하면 

CMP는 쉽게 말하면 '비교' 한다는 뜻이고 정확히는 '두 피연산자를 비교하는 작업'을 말한다.

 

따라서 CMP가 있는 글자를 찾아보자.

찾은 거 같다.

더블 클릭해서 이동하자

위로 스크롤을 좀 올려보면

 

바로 이 세 줄이 입력받은 문자열을 비교한다는 거다.

 

확실하게 알기 알아보자

<F2> 키를 눌러 'break point' 걸어보자

그러면 이렇게 빨간색으로 나탄 난걸 확인할 수 있다.

<F9> 키를 눌러 'break point' 까지 실행 시켜보자

처음 실행한 메시지 박스가 똑같이 나오고

확인을 누르자

똑같이 나오고

여기서 아무거나 입력 해보자

이렇게 스택에 내가 입력한 값이 저장한다는 것을 확인할 수 있다.

 

계속 실행시켜 보자..

그러면 내가 입력 한 '1234' 의 값과 '2G83G35Hs2' 값이 똑같은지 비교를 할 것이고

 

같지 않기 때문에 ZF(Zero Flag)가 0이 된다. (같으면 반대로 1이 되겠죠? ㅎㅎ)

나머지 위에 코드는 해석하기 귀찮기 때문에 여러분들이 알아서 찾아보자

 

코드를 보면 DI SI 를 비교한다고 되어 있고

다음코드(JE)는 같으면 점프 한다고 했기 때문에 

레지스터 ESI 와 EDI 를 보면 값이 같다.

그러면 점프 하겠죠?

 

그러면 딱봐도 저기 보이는 성공 메시지를 점프 해버린다.. ㅠㅠ

따라서 실패 메시지 박스를 볼 수 있다.

 

자 이제 문제를 풀어보자

눈치 챘는분들도 있겠지만 

정답은 바로 여기에 있다.

 

<Ctrl+F2>를 눌러 초기화 시켜 문자열 입력을 다시 저기에 있는 문자로 입력해 보자

계속 실행시켜 보자..

아까와 다르게 ZF(Zero Flag)가 1인 걸 알 수 있다.

계속 실행시켜 보자..

아까와 다르게 SI와 DI 값이 다른 걸 확인할 수 있다.

따라서 값이 다르므로 점프하지 않는 걸 확인할 수 있다.

계속 실행시켜 보자..

그러면 "감사합니다 비밀번호가 정확합니다" 라는 메시지 박스를 볼 수 있다.