맨위로

이 글은 코드엔진(http://codeengn.com/) 에서 제공하는 리버스 엔지니어링 관련 다양한 문제들을 풀어보면서 리버스 엔지니어링을 공부하는 목적으로 작성되었습니다. 이글을 작성하는 필자도 리버스 엔지니어링에 흥미를 가지고 공부하는 입장이므로 잘못된 내용이 있을수도 있습니다. 잘못된 내용이 있다면 댓글이나 방명록에 알려주세요 :)

Challenges : Basic 01 


Author : abex

Korean

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

English

What value must GetDriveTypeA return in order to make the computer recognize the HDD as a CD-Rom 

문제를 확인했으니 파일을 다운로드해서 실행해보도록 하겠습니다.

실행을 하니 "HDD를 CD - Rom 으로 인식하게 하라"는 메시지 창이 나옵니다. 그후 확인 버튼을 클릭시 아래와 같은 메시지 창이 나오게됩니다.

error 를 뿜으며 "이것은 CD - ROM 이 아니다" 라고 메시지를 출력하고있습니다. 그후 프로그램은 종료되게됩니다. 

프로그램을 실행시켜봤으니 본격적으로 리버싱을 하기위해 올리디버거로 파일을 열어보도록 합시다.

복잡해보이지만 처음부터 한번 분석해보도록 하겠습니다.

00401000 ~ 0040100E : MessageBoxA 함수를 호출에서 "Make me think your HD is a CD - ROM." 을 출력하도록 하고 있다.

00401013 ~ 00401018 : RootPathName 을 인자값으로 넣고 GetDriveTypeA 함수를 호출하고 있다. 


다음 주소에 코드를 알아보기전에 GetDriveTypeA라는 함수에 대해서 살펴보자

우선 GetDriveTypeA 함수는 아래와 같은 형태로 RootPathName 값을 입력받아서 드라이브의 타입이 어떤 타입인지 확인하는 함수이다.

GetDriveType function

UINT WINAPI GetDriveType( _In_opt_  LPCTSTR lpRootPathName );


리턴 값은 특정 정수값을 반환하는데 해당 값에 따라 드라이브 타입을 판단할수 있는것이다. 리턴값의 종류에는 아래와 같다.

 Return code

 value

 Description

 DRIVE_UNKNOWN

 0

 알수 없음

 DRIVE_NO_ROOT_DIR

 1

 최상위 경로가 없음

 DRIVE_REMOVABLE

 2

 이동형 저장장치

 DRIVE_FIXED

 3

 고정형 저장장치 (HDD)

 DRIVE_REMOTE

 4

 네트워크 드라이브

 DRIVE_CDROM

 5

 DVD / CD - ROM 유형

 DRIVE_RAMDISK

 6

 램 디스크

즉 우리가 GetDriveType 함수가 DVD / CD - ROM 유형으로 인식하게 하려면 반환값을 5로 바꾸면 된다는 것을 알수 있을것이다. 그러기 위해서는 반환값이 어디에 저장되는지 알필요가있다. 이를 알기위해서 004010D 주소에 break point 를 설정하고 실행시키면 EAX 값에 3이라는 반환값이 저장된다는것을 알수있다. (윈도우나 리눅스에서 대부분의 리턴값들은 EAX 레지스터에 저장된다.)


다음으로 0040101D ~ 00401023 주소를 살펴보면 아래의 과정을 거치게 되는게 쉽게 말하면 INC 는 1을 증가시키는것이고 DEC는 1을 감소시키는것이다. 

INC ESI -> DEC EAX -> JMP SHORT Reverse.0x0401021 -> INC ESI -> INC ESI -> INC ESI -> DEC EAX 

그결과 ESI 값은 3, EAX의 값은 1이 된다.

00401024 : CMP (Compare) 비교 연산을 하고 있다.

00401026 : 앞에서 비교연산을 한결과를 이용한 JE 명령을 하고 있다. 여기서 JE 명령은 비교(CMP)결과가 같으면 지정된 주소로 점프(JMP)하는 연산이다.

여기서 점프하는 주소는 성공메시지가 나오는 주소인 0040103D 로 되어있다. 즉 EAX 값과 ESI 값이 같으면 0040103D 주소로 점프된다는 것이다. 

그러므로 답은 위의 연산결과를 거쳐서 ESI 값인 3과 같은 값이되는 EAX 값을 적으면 된다.




Posted by STIH

댓글을 달아 주세요