문제 1.
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가?
코드엔진의 1번문제이다
HDD를 CD-ROM으로 인식시키기 위해서 GetDriveTypeA의 리턴값이 무엇이 되어야하는지를 알아내야한다.
함수의 이름을 보고 유추할 수 있겠지만, GetDriveTypeA라는 함수는 드라이버를 인식하여 어떤 종류의 드라이버인지 리턴값으로 구분할수 있는 것같다.
그렇다면 GetDriveTypeA는 어떠한 함수일까?
단순 문제를 풀기위한 풀이법은 공부가 되지 않으니, 해당 문제에서 알수 있는 것들을 정리하겠다.
1. GetDriveTypeA
해당 함수는 WINAPI의 함수이다.
WINAPI란 윈도우에서 응용 프로그램을 프로그래밍 하기 위한 함수들의 집합체로 표현 가능하다.
윈도우에서 실행되고 있는 모든 응용프로그램들은 바로 이 WINAPI를 사용하여 만들어 졌다.
이 GetDirveTypeA는 WINAPI 중 하나이다.
아래의 윈도우 개발자 센터에 들어가면 윈도우 API 에 관련한 함수 정의를 확인 할 수 있다.
https://docs.microsoft.com/ko-kr/windows/desktop/api/fileapi/nf-fileapi-getdrivetypea
2. GetDriveTypeA함수 원형
위 사이트에 들어가면 자세한 내용을 알수 있다. 지금은 간략하게 설명하겠다.
함수의 원형을 보면 lpRootPathName을 인자로 받고있는데 변수명 그대로 드라이버가 위치한 경로명을 인자로 주면된다.
GetDriveType의 리턴값은 아래의 표와 같이 정의되어 있다.
리턴값 3은 하드 디스크나 플래시 드라이버를 의미한다는걸 알 수 있고,
리턴값 5는 CD-ROM를 의미한다는 것을 알수 있다.
이제 이러한 개념을 가지고 해당 프로그램을 실행 시켜 보자.
3. 문제풀이
해당 프로그램을 실행시키면 다음과 같은 창이 뜬다.
영어를 해석해보면 "너의 하드디스크를 CD-ROM으로 인식시켜라" 정도로 해석할수 있다.
엔터를 누르면
"나아.. 이건 CD-ROM 드라이버가 아니야" 라는 문구가 뜬다.
이제 위에서 설명한 GetDriveTypeA라는 함수가 실행되는 부분을 찾아서 리턴값을 변경해 주면 된다.
올리디버거로 프로그램을 실행시켜 보자.
1번문제라 그런가 메인으로 실행되는 부분의 위치가 바로 나온다.
처음에 프로그램을 실행시키면 메시지박스에 "Make me think your HD is a CD-Rom" 이라는 내용이 나오는데 해당 부분이 맨처음에 실행된다는 걸 알 수 있다.
총 4개의 PUSH의 인자를 가지고 CALL <UMP.&USER32.MessageBoxA> 의 함수가 호출된다.
오른쪽 설명 부분을 보면 첫번째 메시지 박스의 문자열들을 볼 수 있다.
우리가 궁금한건 그다음 RootPathName에 "c:\" 이라는 인자값을 가지고 GetDriveTypeA 함수가 호출됬을 때의 리턴 값이다.
해당 함수에 브레이크 포인트를 걸고 실행을 해보면 EAX의 값에 3이 찍히는 걸 볼수 있다.
(EAX는 함수의 리턴값이 저장되는 용도를 쓰이는 레지스터이다)
현재 회색 부분이 실행될 부분이다. GetDriveTypeA 함수를 호출하고 나면 EAX에 리턴값이 3이 찍힌다.
그다음 CMP까지의 어셈블리어의 의미는 다음과 같다.
1. INC ESI : ESI의 값을 1증가 시킴 (401000 -> 401001)
2. DEC EAX : EAX 값을 1 감소 시킴 (3 -> 2)
3. JMP : 401021의 주소로 점프
4. INC ESI : ESI의 값을 1 증가 시킴 (401001 -> 401002)
5. INC ESI : ESI의 값을 1 증가 시킴 (401002 -> 401003)
6. DEC EAX : EAX 값을 1 감소 시킴 (2 -> 1)
7. CMP EAX, ESI : EAX값과 ESI 값을 비교함
1) EAX > ESI ZF=0 CF=1
2) EAX < ESI ZF=0 CF=0
3) EAX == ESI ZF=1 CF=0
8. je short 01.40103D : 7번의 결과로 ZF=1 이면 해당 주소로 점프, 아니면 다음 명령어 실행
그렇다면 해당 문제는 끝났다.
현재 EAX값이 7번 까지 행해졌을때 1이고 ESI값은 401003이다.
따라서 6번에서 EAX의 값이 1이므로 저기서 ESI값을 1로 변경하고 7번을 수행하면 두 값이 같게 된다.
오른쪽 레지스터공간에서 ESI 값을 변경해주고 CMP 명령어를 진행후 je 명령어를 실행하면
위와 같이 0040103D의 주소로 이동하게 되고 4개의 인자를 PUSH 한뒤 메시지 박스를 띄우게 된다.
'워게임 > CodeEngn' 카테고리의 다른 글
[CodeEngn] Basic RCE L07 (0) | 2020.12.28 |
---|---|
[CodeEngn] Basic RCE L05 (0) | 2019.05.17 |
[CodeEngn] Basic RCE L04 (0) | 2019.05.16 |
[CodeEngn] Basic RCE L03 (0) | 2019.05.16 |
[CodeEngn] Basic RCE L02 (0) | 2019.05.16 |