codeengn에서 문제를 다운받을 수 있다.
ollydbg를 이용해 진행한다.
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가

ollydbg로 01.exe 파일을 열어보면 다음과 같은 화면을 확인할 수 있다.
ollydbg 좌측 상단 파란 화살표를 누르거나, f9로 실행파일을 실행시킨다.
01.exe 파일은 실행시킬 경우 악성 파일로 간주되어 실행되지 않지만 ollydbg에서는 실행되는 모양 🤔
![]() | ![]() |
|---|
F7, F8 단축키를 통해 프로그램 실행 흐름을 파악할 수 있다.

EAX, ESI 두 레지스터의 값을 비교하여 두 값이 동일할 경우 CD-ROM으로 인식했다는 알림창을 띄워준다.

이때, EAX는 GetDriveTypeA 함수의 리턴값으로, 리턴 직후 값은 3이다. 이 리턴값에 따라 드라이브를 판별한다.
GetDriveTypeA 함수
76FA69F0 > 8BFF MOV EDI,EDI ; 01.<ModuleEntryPoint>
76FA69F2 55 PUSH EBP
76FA69F3 8BEC MOV EBP,ESP
76FA69F5 83EC 0C SUB ESP,0C
76FA69F8 56 PUSH ESI
76FA69F9 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
76FA69FC 57 PUSH EDI
76FA69FD 85F6 TEST ESI,ESI
76FA69FF 74 34 JE SHORT KERNELBA.76FA6A35
76FA6A01 8BD6 MOV EDX,ESI
76FA6A03 8D4D F4 LEA ECX,DWORD PTR SS:[EBP-C]
76FA6A06 E8 31990000 CALL KERNELBA.76FB033C
76FA6A0B 85C0 TEST EAX,EAX
76FA6A0D 74 21 JE SHORT KERNELBA.76FA6A30
76FA6A0F 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
76FA6A12 50 PUSH EAX
76FA6A13 E8 488D0000 CALL KERNELBA.GetDriveTypeW
76FA6A18 8BF8 MOV EDI,EAX
76FA6A1A 85F6 TEST ESI,ESI
76FA6A1C 74 0A JE SHORT KERNELBA.76FA6A28
76FA6A1E 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
76FA6A21 50 PUSH EAX
76FA6A22 FF15 40F00977 CALL DWORD PTR DS:[<&ntdll.RtlFreeUnicod>; ntdll.RtlFreeUnicodeString
76FA6A28 8BC7 MOV EAX,EDI
76FA6A2A 5F POP EDI
76FA6A2B 5E POP ESI
76FA6A2C C9 LEAVE
76FA6A2D C2 0400 RETN 4

76FA6A13 오프셋에서 호출하는 GetDriveTypeW 함수는 드라이브 유형을 정수로 리턴한다. 마이크로소프트 공식 페이지에서 리턴값을 확인할 수 있다.
01번 문제는 CD-Rom으로 인식시키기 위핸 GetDriveTypeA의 리턴값을 찾는 문제였으므로, 리턴값 EAX는 5가 되어야 한다.

그럼 리턴된 EAX값을 5로 변조하면 성공 알림창이 나올까? 윈도우 10 기준으로는 아니다 ^_ㅠ...

JE 문에 브레이크포인트(F2)를 걸어주고 프로그램을 실행시킨 결과, EAX는 1, ESI는 0041003이 저장된 것을 확인할 수 있다.
ESI의 경우, 윈도우7에서는 0부터 시작하지만, 윈도우10에서는 시작 주소가 부여되는 것으로 보인다.
GetDriveTypeA 함수에서 리턴된 값을 5로 변조하여도 EAX=3, ESI=0041003 이기 때문에 CMP의 결과가 거짓이라고 판단, JE문을 건너뛰고 에러 메세지 출력 함수가 실행된다.

CD-Rom 알림창을 띄위기 위해 JE문의 플래그를 변조해보자. Ollydbg 우측 Registers 화면에서 변경할 수 있다.
CMP 결과 두 레지스터 값이 같을 경우 ZF(Zero Flag)는 참(1)이 된다. 따라서 다음과 같이 ZF 플래그를 1로 변경한다.

플래그값 변조 후 프로그램을 다시 실행해보면 CD-Rom으로 인식되었다는 알림창을 확인할 수 있다.
이외에도 JE 구문을 JNE 구문 (CMP 결과 두 레지스터 값이 일치하지 않을 경우)으로 변경하는 방법 등, 다양한 방법이 있다.
codeengn에서 다양한 해설을 깃허브에 모아뒀으니 확인하며 여러가지 문제 풀이 방법을 찾아보는 것도 좋을 것 같다.