워게임/CodeEngn

[CodeEngn] Basic RCE L01 공부

name2965 2022. 4. 14. 20:32
728x90

 

 

 

 

문제는 다음과 같습니다

 

먼저 Exeinfope를 통해서 살펴보면

 

 

 

 

다음과 같이, 아무런 패킹이 안되어있고 32비트 프로그램인것을 확인해볼수 있습니다.

 

 

 

 

프로그램을 실행시켜보면 다음과 같은 창이 뜨고

 

 

 

다음과 같은 창이 뜨면서 프로그램이 끝나는것을 확인할수 있습니다.

 

프로그램이 어떤 방식으로 돌아가는지 분석하기 위해, x32dbg를 통해서 살펴보겠습니다.

 

 

 

 

한번 실행시켜보면 EP에서 멈춥니다.

 

여기서부터 한 단계씩 실행시켜보면서 프로그램의 실행흐름을 살펴보면,

"abex' 1st crackme"

"Make me think your HD is a CD-Rom"

라는 메세지들이 MessageBoxA함수를 통해서 출력된 후에 

"c:\\"라는 드라이브 루트의 이름이 push된 후에 GetDriveTypeA라는 함수가 call되는것을 확인할수 있습니다.

 

 

GetDriveTypeA함수의 반환값

 

GetDriveTypeA함수는 디스크 드라이브의 유형을 판별해서 그에맞는 반환값을 반환하는 함수인데

CD-ROM인 경우, 5를 반환한다고 나와있습니다.

 

 

 

 

GetDriveTypeA 함수가 끝나고 esi, eax 레지스터의 증감 연산이 끝난후 두 레지스터를 비교해서 ZF=1 인 상황에서 

우리가 원하는 주소로 점프를 하는 방식인것을 알수있습니다.

 

일반적인 경우에는 비교연산을 하기전에 eax는 1이고 esi는 00401003이 되므로 ZF=0 입니다.

 

그러므로 GetDriveTypeA 함수의 리턴값을 조작해줘야 합니다.

 

위에서 봤듯이 GetDriveTypeA 함수는 CD-ROM인 경우 5를 반환하기 때문에 

eax값을 00401000 + 5 로 바꿔줍니다.

 

 

 

 

이렇게 하고서 F8을 통해서 한단계씩 진행해보면 연산 과정을 거쳐서 ZF=1이 되는것을 확인해볼수 있고 

결과적으로 프로그램 내에서는 디렉토리를 CD-ROM으로 인식한것으로 확인해볼수 있습니다.

 

 

 

 

이로서 GetDriveTypeA의 반환값은 5가 되어야 한다는 것을 알수있습니다.

728x90

'워게임 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L05  (0) 2022.05.08
[CodeEngn] Basic RCE L04  (0) 2022.05.04
[CodeEngn] Basic RCE L03  (0) 2022.05.04
[CodeEngn] Advance RCE L07  (0) 2022.05.03
[CodeEngn] Basic RCE L02 공부  (0) 2022.04.14