#About
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
#Contents
함수 GetDriveTypeA의 리턴 값을 구하는 것이 문제이며, 리턴 값이 담기는 레지스터를 알아내는 것이 목표이다
#Solution
[그림 1]
[그림 2]
문제 파일을 실행하면 위와 같은 두 메시지 박스를 확인할 수 있고, 에러 메시지를 담고 있는 두 번째 박스에서
이것은 CD-ROM Drive가 아니라는 문구를 확인할 수 있다
[그림 3]
올리디버거로 해당 프로그램을 열어 보았고 어셈블리코드를 확인할 수 있다
해당 문제는 HDD를 CD-Rom으로 인식시키는 것이며 즉, 주소 00401026의 조건 분기점에서 조건의 일치를 통해
0040103D 넘어가 "Ok, I really think that your HD is a CD-ROM! :p"라는 문구를 확인할 수 있는 조건을 찾는 것이다
주소 00401026의 코드를 확인하면 JE 즉, Jump if Equl이란 뜻으로 Zero Flag(이하 ZF)의 값이 1일 때 분기를 하는
조건 분기문이 있고, ZF의 값은 바로 윗줄에 존재하는 CMP EAX,ESI라는 코드 결과에 따라 달라진다
명령어 CMP는 뒤에 오는 레지스터 EAX와 ESI을 비교하며, 구체적으로는 서로 값을 뺀 다음
그 결과가 0이라면 값이 서로 같다는 의미이기에 ZF를 1로 세팅하며 이 값은 조건 분기문의 조건으로 쓰인다
에러메시지가 출력되는 이유는 CMP EAX,ESI의 조건에서의 ZF가 0이며 이는 EAX와 ESI의 값이 서로 일치하지
않음을 뜻하기 때문에 출력되며 조건을 맞춰주기 위한 EAX 값의 확인을 위해 함수 GetDriveTypeA가 호출 된 후에
브레이크포인트를 걸고 EAX 값의 확인을 하면 아래와 같은 값을 확인할 수 있다 (EAX를 확인한 이유는 함수의 리턴 값이 담기는 레지스터기 때문임)
[그림 4] - 레지스터 값 확인
함수 GetDriveTypeA가 호출 된 후 EAX 값은 3이며 ESI 값은 0임을 확인할 수 있음
[그림 5]
주소 0040101D~00401023의 코드를 확인하면 ESI 값이 3번 증가, EAX 값이 2번 감소함
EAX = 1 , ESI = 3
위 레지스터에 담긴 값으로 CMP 명령을 통해 비교해 같아야 하므로 EAX 값은 5가 되어야 함
즉, HDD를 CD-Rom으로 인식시키기 위해 GetDriveTypeA의 리턴 값은 5가 됨
+
MSDN에서도 확인가능
Return code/value |
Description |
DRIVE_UNKNOWN 0 |
The drive type cannot be determined |
DRIVE_NO_ROOT_DIR 1 |
The root path is invaild; for example, there is no volume at the specified path. |
DRIVE_REMOVABLE 2 |
The drive has removable media; for example, a floppy drive, thumb drive, or flash card reader. |
DRIVE_FIXED |
The drive has fixed media; for example, a hard disk drive or drive. |
DRIVE_REMOTE 4 |
The drive is a remote (network) drive |
DRIVE_CDROM 5 |
The drive is a CD-ROM drive. |
DRIVE_RAMDISK 6 |
The drive is a RAM disk. |
'Wargame' 카테고리의 다른 글
CodeEngn Basic 3 (0) | 2017.09.05 |
---|---|
CodeEngn Basic 2 (0) | 2017.09.04 |
[STEGANOGRAPHY] Codegate 2013 - Forensic 300 (0) | 2017.07.21 |
[DISK] Codegate 2013 > Forensic 200 (16) | 2017.07.20 |
[DISK] Codegate 2013 > Forensic 100 (0) | 2017.07.19 |