본문 바로가기

[리버스엔지니어링]/* 코드엔진

[리버스엔지니어링] 문제1 : Basic RCE L01 풀이

문제 프로그램 출처 : https://codeengn.com/

 

CodeEngn [코드엔진]

CodeEngn ReverseEngineering Conference

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)"가 아니더라도, 인식한거 처럼 메시지를 띄울 수 있습니다.