네 오늘은 코드엔진의 문제를 풀어보겠습니다.

http://codeengn.com/ 으로 들어가 challenges - start - basic rce의 level 1 문제를 클릭합니다. 이 사이트는 회원가입을 하지 않아도 됩니다.


음 문제가 나왓습니다. Author(저자)은 abex 이군요. HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가? 뭔 소리일까요? 일단 밑에 다운로드문구가 보입니다. 눌러서 파일을 받아 봅시다.

흠 한번 실행해 봅시다.


너의 하드를 CD-ROM으로 생각하도록 나를 만들어라. 즉 이프로그램을 만져서 저의 하드를 cd롬으로 인식시켜야 할 것 같습니다.

이것은 CD-ROM드라이브가 아니라고 뜨는 군요.

파일을 올리디버그로 열어봅시다.

OEP는 00401000이네요. 그림을 보시면 좌측에 빨간 글자로 된 함수를 보실 수 있습니다.

먼저 MessageBoxA함수를 살펴봅시다. 함수명만 봐도 하는 일이 딱 감이 옵니다. 메세지 박스를 띄워주는 함수이네요. 내용을 보면 아까 실행할 때 보였던 문자열이 보입니다.

Nah... This is not a CD-ROM Drive

드라이브가 CD-ROM이 아니라는 '실패' 문자열입니다. 그럼 반대로 성공 문자열도 있겠지요. 바로 밑에 있네요.

OK, I really think that your HD is a CD-ROM!

자 이쯤 에서 문제를 한번 체크 해 봅시다.

HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가?

즉 바꿔 말하면 성공문자열이 적힌 메세지박스함수를 실행시키기 위한 GetDriveTypeA의 리턴값을 구해라 라고 되겠네요.

GetDriveTypeA 함수 바로 다음 부분에 브레이크를 걸고 실행해 봅시다. 함수의 리턴값은 함수가 끝날때 반환되는 값이기 때문에 GetDriveTypeA함수를 호출하고 난 후 바로 멈추도록 브레이크를 걸었습니다. (브레이크를 걸고 실행하면 실행하다가 브레이크를 건 명령어를 실행하기 바로 전에 멈춥니다.)



정상적으로 함수가 호출되고 종료되었습니다. 반환값을 확인해 봅시다. 함수의 리턴값은 레지스터에 저장됩니다. 레지스터는 여러 레지스터가 있는데 일단 함수의 반환값은 EAX레지스터에 저장되는 것만 확인하시면 됩니다.

EAX값이 3으로 되어있네요. 즉 기본 GetDriveTypeA 함수의 반환값은 3입니다.

다만 이 반환값으론 성공문자열을 가지 못하고 실패 문자열로 가게 됩니다. 원인을 살펴보면 도중에 아래와 같은 명령어를 볼 수 있습니다.

명령어들을 살펴봅시다.

CMP [값1],[값2] = 값1과 값2를 비교하여 두 값이 같으면 1 다르면 0을 ZeroFlag에 대입합니다.
JE [주소] = ZeroFlag의 값이 1일 경우 해당 주소로 점프한다.

확인해봅시다. CMP 다음 명령문에 브레이크를 걸고 실행해봅시다.

 

CMP EAX,ESI 가 실행되었습니다. 레지스터 값을 확인해 봅시다.

함수의 반환값 즉 EAX레지스터의 값은 1, ESI 레지스터 값은 3, 1과 3은 다르므로      z(ZeroFlag)의 값은 0이 됩니다. z값이 0이 됨으로써 JE 명령문에서 점프를 하지 않고
그대로 실행함으로써 실패문자열이 출력됩니다.

우리가 원하는 성공문자열을 출력하기 위해서는 JE명령문에서 점프를 해야 합니다. 점프를 하기 위해선 ZF의 값을 1로 맞춰줄 필요가 있고  ZF가 1이 되기 위해선 EAX와 ESI의 값이 같아야 합니다.

EAX는 1이고 ESI는 3입니다.  이중 함수의 반환값은 EAX이고 EAX는 ESI보다 2작으므로 기본 함수 반환값(EAX)에 2를 더해서 5로 만들어줘 최종적으로 EAX와 ESI가 값이 3으로 통일되도록 만들어줍시다.

수정하는 방법은 EAX 값을 더블클릭 하면 됩니다.

성공적으로 수정했을 시 성공문자열이 출력됩니다. 그러면 정답은 성공으로 가는 EAX값 즉 5가 됩니다.

감사합니다.

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 8  (0) 2015.08.05
codeengn - basic rce level 7  (0) 2015.08.03
codeengn - basic rce level4  (0) 2015.07.20
codeengn - bagic rce level3  (0) 2015.07.20
codeengn - basic rce level2  (0) 2015.07.15
CodeEngn - basic rce level 1  (5) 2015.07.15
Posted by englishmath