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

최초 실행해보면 다음과 같은 HDD를 CD-ROM으로 인식시키게 만들라는 문구를 확인할 수 있었다.

이후 확인을 눌러보면 추가적으로 이후에 CD-ROM 드라이브가 아니라는 출력 문구도 확인할 수 있었다.

이제 올리 디버거를 통해 확인해보면
성공적으로 인식했을 때 출력되는 문구가 출력되는 주소가 40103D 임을 확인하였다.
해당 주소로 점프하는 분기점인 401026 주소가 있었고 바로 위 401024 주소에서 EAX와 ESI값을 비교하는 것을 확인 하였다.
- CMP 명령어는 'Compare'로 두 인자값을 비교하여 결과로 flag를 세팅하는 역할을 수행한다.
> 보통 CMP명령어는 JE와 같은 조건부 분기 명령어들과 같이 사용한다.
- JE 명령어는 'Jump if Equal'로 비교 결과에 대해 값이 같을 때 점프를 수행한다.

추가적으로 40101D 주소에서 ESI와 EAX를 INC, DEC 명령을 통해 값을 증감시키는 것을 확인하였고,
INC ESI 3번, DEC EAX 2번으로, 총 ESI는 3 증가, EAX는 2 감소하였다.
- INC(increase)명령어는 1증가, DEC(decrease)명령어는 1 감소를 의미한다.
따라서 최초의 ESI와 EAX 값을 확인하기 위해 40101D에서 BP(f2 단축키)를 걸고 디버깅을 진행한다.
- 한 줄씩 실행하기 위해서는 Step over(f8 단축키)로 살펴본다.

40101D 주소에서 ESI의 초기값은 3인 것을 확인해 볼 수 있다.

401024의 주소에서 EAX의 값이 2만큼 감소하여 1로 변경된 것을 확인할 수 있다.
하지만 현재 EAX와 ESI의 값은 다르므로 실패로 분기하게 된다. 그래서 첫 실행 때 에러 문구가 발생한 것이다.

그렇다면 왜 실패했는지 분석하기 위해 다시 처음으로 돌아왔다.
Comment 부분을 보면 빨간 글씨로 GetDriveTypeA 함수를 확인해 볼 수 있다.
이 함수가 어떤 역할을 수행하는 지 구글링을 통해 알아보기로 했다.

GetDriveTypeA 함수 | GetDriveTypeA 함수(fileapi.h) - Win32 apps | Microsoft Learn
이 '반환코드/값'을 [그림 7]과 비교해서 보면
현재 401013 주소에서 인식하고 C:\는 FIXED 형태로 위에서 ESI의 초기값이 3인 것으로 보아 고정된 형태로 C드라이브를 인식하고 있는 듯 하다.
하지만 이 C:\ 를 CD-ROM으로 인식시키기 위해서는 GetDriveTypeA 함수의 리턴 값이 5가 되어야 한다.
성공 문구 출력

ESI를 5값을 갖게 하는 방법도 있겠지만 간단한 패치만으로도 결과를 출력해 낼 수 있다.
401026주소를 더블 클릭하면 명령어를 패치할 수 있는데, 조건 분기인 JE 명령어 대신 항상 점프하는 JMP 명령어로 패치를 진행하여 항상 성공분기점으로 가는 명령어를 수행하게 만들면 된다.

패치를 진행하면 이렇게 성공 문구를 확인해 볼 수 있다.
'Reversing > CodeEngn' 카테고리의 다른 글
| [CodeEngn] RCE basic L06 풀이 (3) | 2025.09.01 |
|---|---|
| [CodeEngn] RCE basic L05 풀이 (3) | 2025.08.31 |
| [CodeEngn] RCE basic L04 풀이 (0) | 2025.08.31 |
| [CodeEngn] RCE basic L03 풀이 (1) | 2025.08.29 |
| [CodeEngn] RCE basic L02 풀이 (1) | 2025.08.29 |