본문 바로가기

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

[ CodeEngn ] Basic RCE 7 문제 풀이

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

 

CodeEngn.com [코드엔진]

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

ch.codeengn.com

7번 문제이고 밑 파일을 다운로드해서  압축을 풀어주자

실행파일 하나가 보인다.

더블 클릭해서 실행 하자

아마 시리얼 키를 입력해서 푸는 문제인 것 같다.

틀리면 나오는 문구이다.

확인을 클릭하면 프로그램이 종료된다.

 

문제에서 컴퓨터 C 드라이브의 이름이 CodeEngn 일 경우라고 했으니

 드라이브 이름을 'CodeEngn'으로 바꿔보자

이제 'OllyDbg' 도구를 이용해 07.exe 파일을 뜯어보자

main을 찾는 방법이 2가지 있다.

 

첫번째 방법은 함수를 찾는 방법이다.

어셈블리코드 우클릭 -> Search for -> All intermodular calls

 

함수를 살펴보면 GetVolumeInformationA 함수를 볼 수 있다. 

GetVolumeInformation 함수는 지정된 볼륨 정보를 가져오는 함수입니다.

VolumeNameBuffer 통해 드라이브 명을 가져오는 것을 확인할 수 있다.

 

00401099 주소에 BP를 걸로 확인을 해보았더니 

 0040225C에 C드라이브 볼륨명을 PUSH 했다는 것을 알 수 있다.

lstrcatA 함수를 지나고 나면 4562-ABEX 와 CodeEngn 이 합쳐짐을 알 수 있다.

이 코드를 해석하면 DL에 2를 넣어주고 40225C~40225F를 +1 연산을 하며, 총 2회 후 빠져나간다

1회 진행

 

2회 진행

 

그리고 실행 하면서 이상한게 보인다.

1회를 실행할  "Code"글자가 "Dpef"로 바뀌는 것을 확인할 수 있었다.

2회를 실행할 때 "Dpef" 글자가 " Eqfg" 로 바뀌는 것을 확인할 수 있었다.

 

코드를 실행하다 보니 사용자가 입력했던 값 String2 그리고 "L2C-5781EqfgEngn4562-ABEX" 값 String1로 되는 것을 알 수 있었다.

lstrcmpiA 함수를 통해 String1과 사용자의 임의의 시리얼 입력 값이었던 "Enter your serial"와 비교 후

일치하지 않으면 점프하지 않고 실패 MessageBoxA를 호출한다.

값이 일치한다면 00401117로 점프하여 성공 구문인 MessageBoxA를 호출한다.

 

두 번째 방법은 실패 구문을 찾는 것이다.

어셈블리코드 우클릭 -> Search for -> All referenced text strings

실패 문구를 찾아 더블 클릭해서 들어가 보자

위로 올려다 보면 GetVolumeInformationA 함수를 볼 수 있다.