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

 

간단하게 C드라이브를 CD-Rom으로 인식시키는 문제이다.

 

문제만 봤을 때는, GetDriveTypeA 함수 실행 시 해당 경로의 드라이브가 C드라이브인 경우의 RETN 값과 CD-Rom  일때의 RETN 값이 다르다는 것을 추측할 수 있다.

 

문제와 함께 제시된 실행 파일을 실행시켜 본다.

여기서 확인을 누르면

CD-Rom 드라이브가 아니라고 출력한다.

 

디버거로 분석하기 전에 프로그램의 기본 정보를 알아보기 위해 STUD_PE 프로그램으로 열어보았다.

32bit 프로그램이고,

UPX 패킹이 되어있지 않음을 알 수 있다.

 

UPX 패킹이 되어있는 프로그램의 경우

저기 CODE, DATA, .idata, .reloc 부분이 전부 UPX0, UPX1로 덮혀져 있다.

UPX로 패킹되어 있는 프로그램의 섹션 예시

이제 이 프로그램을 Olly-Dbg로 열어본다.

전체 프로그램의 어셈블리 코드이다.

 

사용되는 함수는 MessageBoxA와 GetDriveTypeA 이렇게 두 종류가 있다.

 

MessageBoxA : 개발자가 출력하고자 하는 문자열을 보여주는 함수

GetDriveTypeA : 해당 드라이브의 타입에 따라 RETN 값을 보내줌.

 

우리가 봐야할 함수는 GetDriveTypeA이다.

 

대부분의 함수의 리턴 값(RETN)은 EAX 레지스터에 저장된다.

 

그러므로 GetDriveTypeA 까지 실행시키고 그 다음의 EAX 값을 보기 위해

CALL GetDriveTypeA 함수 다음 라인에 BP(BreakPoint, F2)를 걸고 실행(Run, F9)시켜 보았다.

 

현재 CALL 이후 INC 명령어를 실행시키기 직전의 상황.

 

이 상태에서 EAX 값을 본다.

 

EAX = 00000003이다.

 

어셈블리 코드를 쭉 보면, 어디서 이 00000003이 CD-Rom이 아니라고 판별하는지 알 수 있다.

 

GetDriveTypeA 함수가 끝난 후,

 

INC ESI

DEC EAX

JMP 00401021 : 의미없는 코드

INC ESI

INC ESI

DEC EAX

CMP EAX, ESI

JE 0040103D

 

요약하면, ESI를 3번 +1 하고, EAX를 2번 -1 한다.

이후에 ESI와 EAX가 같으면(JE, Jump Equal)

0040103D("Ok, I really think that your HD is a CD-ROM! :P" - 성공 메시지)로 점프

 

즉, 우리가 CD-ROM으로 인식시키기 위해서는 CMP 위치에서 EAX와 ESI을 동일한 값으로 맞춰주면 된다.

 

그럼 다시, CMP 부분에 BP를 걸고 F9를 눌러서 BP 위치까지 실행을 시킨다.

현재 BP(CMP) 대기 중인 상황.

 

여기서 Register 값을 보자.

ESI는 3이고, EAX는 1이다.

하지만 이 값들은 ESI를 +3한 값이고, EAX를 -2한 값이다.

 

EAX와 ESI가 같아야 CD-Rom으로 인식되기 때문에,

ESI와 EAX는 현재 2만큼 값이 차이나고 있으므로 EAX에 +2를 해주어야 CMP 부분에서 3으로 같아지게 된다.

 

앞에서 GetDriveTypeA의 리턴 값이 EAX=3이었기 때문에

GetDriveTypeA의 리턴 값이 EAX=5가 된다면 프로그램은 C드라이브를 CD-Rom으로 인식할 것으로 추측할 수 있다.

저 부분에 BP를 걸고 F8로 step over한 후에,

 

EAX의 값을 5로 수정해 준다.

EAX를 더블클릭 하면 수정할 수 있음.

 

추가적으로, ESI 부분이 지금 00401000으로 잡혀있는데,

이 상태에서는 CMP EAX, ESI 부분이 우리가 원하는 상태로 제대로 실행되지 않는다.

그러므로 ESI도 0으로 바꿔준다.

최종적으로 변경된 레지스터 상태.

 

이후 실행해보면

정상적으로 C드라이브를 CD-Rom으로 인식하게 된다.

'보안 & 모의해킹 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L04 풀이  (0) 2019.07.01
[CodeEngn] Basic RCE L03 풀이  (0) 2019.07.01
[CodeEngn] Basic RCE L02 풀이  (0) 2019.07.01
Posted by NDC :