문제 프로그램 출처 : https://codeengn.com/
코드엔진 Basic RCE L01 문제 풀이
ㄴ HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가
일단 MSDN에 들어가, GetDriveTypeA 함수에 대해서 검색해봤습니다.
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea
"HDD를 CD-Rom으로 인식시키기 위해서는"라는 조건에 맞추려면, 정답은 "DRIVE_CDROM" 즉, 5가 정답일 것입니다.
번외
CheatEngine(치트엔진)을 이용해, "Basic RCE L01" 코드를 보면, MessageBoxA 함수를 통해,
"abex' 1st crackme" 캡션을 가진, 메시지가 뜬 후, 확인을 누르면 GetDriveTypeA 함수를 호출합니다.
01.exe+1000 - 6A 00 - push 00 { 0 }
01.exe+1002 - 68 00204000 - push 01.exe+2000 { ("abex' 1st crackme") }
01.exe+1007 - 68 12204000 - push 01.exe+2012 { ("Make me think your HD is a CD-Rom.") }
01.exe+100C - 6A 00 - push 00 { 0 }
01.exe+100E - E8 4E000000 - call 01.exe+1061 { ->->USER32.MessageBoxA }
01.exe+1013 - 68 94204000 - push 01.exe+2094 { (6044259) }
01.exe+1018 - E8 38000000 - call 01.exe+1055 { ->->KERNEL32.GetDriveTypeA }
01.exe+101D - 46 - inc esi
01.exe+101E - 48 - dec eax
01.exe+101F - EB 00 - jmp 01.exe+1021
01.exe+1021 - 46 - inc esi
01.exe+1022 - 46 - inc esi
01.exe+1023 - 48 - dec eax
01.exe+1024 - 3B C6 - cmp eax,esi
01.exe+1026 - 74 15 - je 01.exe+103D
01.exe+1028 - 6A 00 - push 00 { 0 }
01.exe+102A - 68 35204000 - push 01.exe+2035 { ("Error") }
01.exe+102F - 68 3B204000 - push 01.exe+203B { ("Nah... This is not a CD-ROM Drive!") }
01.exe+1034 - 6A 00 - push 00 { 0 }
01.exe+1036 - E8 26000000 - call 01.exe+1061 { ->->USER32.MessageBoxA }
01.exe+103B - EB 13 - jmp 01.exe+1050
01.exe+103D - 6A 00 - push 00 { 0 }
01.exe+103F - 68 5E204000 - push 01.exe+205E { ("YEAH!") }
01.exe+1044 - 68 64204000 - push 01.exe+2064 { ("Ok, I really think that your HD is a CD-ROM! :p") }
01.exe+1049 - 6A 00 - push 00 { 0 }
01.exe+104B - E8 11000000 - call 01.exe+1061 { ->->USER32.MessageBoxA }
01.exe+1050 - E8 06000000 - call 01.exe+105B { ->->KERNEL32.ExitProcess }
01.exe+1055 - FF 25 50304000 - jmp dword ptr [01.exe+3050] { ->->KERNELBASE.GetDriveTypeA }
01.exe+105B - FF 25 54304000 - jmp dword ptr [01.exe+3054] { ->KERNEL32.ExitProcess }
01.exe+1061 - FF 25 5C304000 - jmp dword ptr [01.exe+305C] { ->USER32.MessageBoxA }
01.exe+1067 - 00 00 - add [eax],al
이후, "01.exe+1024" 분기점에 BP(브레이크 포인트)를 건후, 확인해보니 eax 레지스터에 GetDriveTypeA 함수를 통해
"DRIVE_NO_ROOT_DIR"이 리턴되었다는걸 확인할 수 있습니다.
후킹을 통해, eax 레지스터 값을 변경하거나, "01.exe+1026"에 "je 01.exe+103D"를 "jne 01.exe+103D"으로
변경함으로써, 리턴 값이 "DRIVE_CDROM(5)"가 아니더라도, 인식한거 처럼 메시지를 띄울 수 있습니다.