문제 설명
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으로 인식된 것을 알 수 있다.
'Reverse Engineering > CodeEngn Basic' 카테고리의 다른 글
| [리버싱] CodeEngn Basic RCE L06 (0) | 2024.09.19 |
|---|---|
| [리버싱] CodeEngn Basic RCE L05 (0) | 2024.09.19 |
| [리버싱] CodeEngn Basic RCE L04 (0) | 2024.09.15 |
| [리버싱] CodeEngn Basic RCE L03 (1) | 2024.09.15 |
| [리버싱] CodeEngn Basic RCE L02 (0) | 2024.09.15 |