본문 바로가기

Reverse Engineering/CodeEngn Basic

[리버싱] CodeEngn Basic RCE L01

문제 설명

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


개념 설명

GetDriveType 함수: 인자로 전달받은 드라이브가 어떤 종류의 드라이브인지 판별하여 리턴하는 함수이다.

GetDriveType 함수의 원형은 UINT WINAPI GetDriveType( _In_opt_ LPCTSTR lpRootPathName ); 이다.

DRIVE_REMOVABLE : 제거 가능한 USB

DRIVE_FIXED : 고정되어 있는 드라이브 ->C드라이브나 D드라이브

DRIVE_REMOTE : 네트워크 가상의 드라이브

return code/value Description
DRIVE_UNKNOWN
0
The drive type cannot be determined.
드라이브 유형을 확인할 수 없습니다.
DRIVE_NO_ROOT_DIR
1
The root path is invaild 
ex) there is no mounted at the specified path.
루트 경로가 잘못되었습니다.
예를 들어 지정된 경로에 탑재된 볼륨이 없습니다.
DRIVE_REMOVABLE
2
The drive has removable media. 
ex) a floopy drive, thumb drive, or flash card reader
드라이브에 이동식 미디어가 있습니다.
예를 들어 플로피 드라이브, 썸 드라이브 또는 플래시 카드 판독기입니다.
DRIVE_FIXED
3
The drive has fixed media
ex) a hard disk drice or flash drive
드라이브에 고정 미디어가 있습니다. 예를 들어 하드 디스크 드라이브 또는 플래시 드라이브입니다.
DRIVE_REMOTE
4
The drive is a remote (network) drive
드라이브는 원격(네트워크) 드라이브입니다.
DRIVE_CDROM
5
The drive is a CD-ROM drive
드라이브는 CD-ROM 드라이브입니다.
DRIVE_RAMDISK
6
The drive is a RAM disk
드라이브가 RAM 디스크입니다.

문제 설명

https://codeengn.com/challenge/

 

RCE Basic 1번 문제를 풀어보자.

 

우선 압축 파일을 7-zip file manager로 풀어보자.

 

 

 

프로그램을 열고, 문제 파일을 저장해둔 C:\codeengn\로 들어가자.

 

압축을 풀어준다.

그리고 폴더로 들어가 압축을 푼 파일을 열어준다.

 

파일을 열면 다음과 같은 문장이 나온다.

그리고 에러가 뜬다.

CD-ROM이 아니어서 그런것 같다. 해결해보자.

 

우선 어셈블리어를 살펴보기 위해 Immaunity Debugger를 켜주고 파일을 열어주자.

 

키면 다음과 같은 화면이 뜬다.

 

이제 어셈블리어를 살펴보자.

첫 번째 문장은 여기서 나오는 것 같다.

 

에러는 여기서 나오는 것 같고,

 

여기에 있는 문장이 나오도록하면 문제를 해결할 수 있을 것 같다.

 

일단 GetDriveTypeA로 묶인 함수로 들어가보자. 들어가는 단축키는 F7이다.

 

계속 들어가다보면 중간에 더 이상 들어갈 수 없는 부분이 나오게 된다.

그 부분에서 F8로 한 줄씩 실행시키다 보면 EAX 레지스터에 3이라는 값이 저장되어 있는 것을 알 수 있다.

아마 이 드라이브는 고정 미디어로 설정되어 있던 것 같다.. 

 

다시 처음으로 돌아가보자. 재실행 단축키는 Ctrl F2이다.

 

한줄씩 실행시켜보니 아까 해결책으로 추정했던 세 번째 문장이 실행되지 않은 것을 알 수 있다.

JMP(Jump)문을 활용해서 실행시켜주자.

 

이 부분을 

이렇게 바꿔주고, 한줄씩 실행해주면

어셈블리어에 있었던 문장이 나오며, CD-ROM으로 인식된 것을 알 수 있다.