Tiny Bunny

Wargame/CodeEngn

Basic RCE L01

bento 2023. 11. 22. 21:59

 

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


CodeEngn Basic RCE L01 (abex' 1st crackme)

 

*GetDriveTypeA

https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea

 

타입에 따라 반환 값이 다르다

CD-ROM의 경우 5인 것을 그냥 확인 가능. .

하지만 다른 방법으로 확인해보기로 한다

 

처음 실행시키면 해당 창이 뜬다

CD-Rom으로 인식시키라고 한다

 

1. ZF값을 변조 시켜 점프 시킨다.

00401000 | 6A 00                    | push 0                                  |
00401002 | 68 00204000              | push 01.402000                          | 402000:"abex' 1st crackme"
00401007 | 68 12204000              | push 01.402012                          | 402012:"Make me think your HD is a CD-Rom."
0040100C | 6A 00                    | push 0                                  |
0040100E | E8 4E000000              | call <JMP.&MessageBoxA>                 |
00401013 | 68 94204000              | push 01.402094                          | 402094:"c:\\\\"
00401018 | E8 38000000              | call <JMP.&GetDriveTypeA>               |
0040101D | 46                       | inc esi                                 | esi:EntryPoint
0040101E | 48                       | dec eax                                 |
0040101F | EB 00                    | jmp 01.401021                           |
00401021 | 46                       | inc esi                                 | esi:EntryPoint
00401022 | 46                       | inc esi                                 | esi:EntryPoint
00401023 | 48                       | dec eax                                 |
00401024 | 3BC6                     | cmp eax,esi                             | esi:EntryPoint
00401026 | 74 15                    | je 01.40103D                            |
00401028 | 6A 00                    | push 0                                  |
0040102A | 68 35204000              | push 01.402035                          | 402035:"Error"
0040102F | 68 3B204000              | push 01.40203B                          | 40203B:"Nah... This is not a CD-ROM Drive!"
00401034 | 6A 00                    | push 0                                  |
00401036 | E8 26000000              | call <JMP.&MessageBoxA>                 |
0040103B | EB 13                    | jmp 01.401050                           |
0040103D | 6A 00                    | push 0                                  |
0040103F | 68 5E204000              | push 01.40205E                          | 40205E:"YEAH!"
00401044 | 68 64204000              | push 01.402064                          | 402064:"Ok, I really think that your HD is a CD-ROM! :p"
00401049 | 6A 00                    | push 0                                  |
0040104B | E8 11000000              | call <JMP.&MessageBoxA>                 |
00401050 | E8 06000000              | call <JMP.&ExitProcess>                 |
00401055 | FF25 50304000            | jmp dword ptr ds:[<GetDriveTypeA>]      |
0040105B | FF25 54304000            | jmp dword ptr ds:[<ExitProcess>]        |
00401061 | FF25 5C304000            | jmp dword ptr ds:[<MessageBoxA>]        |

00401026     |   74 15                 |   je 01.40103D

 

ZF는 연산 결과 값이 0이면 1반환(참)

 

ZF가 0 > 점프하지 않고 계속 진행하여

ZF가 1 > 40103D로 점프

 

해당 부분에서 ZF가 0임을 확인할 수 있고

이를 1로 변조시켜주면

 

해결할 수 있다.

 

2. 조건 분기 명령어 je 대신 jmp로 바꿔준다


그래서 HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴 값을 구해보면

이때 EAX는 3, ESI는 0임을 알 수 있는데

 

 

중간에 EAX 값은 총 -2, ESI 총 +3 되는 것을 볼 수 있다

EAX-2 = 0+3

EAX = 5

 

정답 = CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴 값

: 5

728x90

'Wargame > CodeEngn' 카테고리의 다른 글

Basic RCE L06  (0) 2023.12.19
Basic RCE L05  (0) 2023.12.19
Basic RCE L04  (0) 2023.12.19
Basic RCE L03  (0) 2023.11.22
Basic RCE L02  (0) 2023.11.22