[codeengn] basic #01

·2025년 6월 24일

codeengn에서 문제를 다운받을 수 있다.
ollydbg를 이용해 진행한다.


문제

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


1. 파일 실행


ollydbg로 01.exe 파일을 열어보면 다음과 같은 화면을 확인할 수 있다.

ollydbg 좌측 상단 파란 화살표를 누르거나, f9로 실행파일을 실행시킨다.
01.exe 파일은 실행시킬 경우 악성 파일로 간주되어 실행되지 않지만 ollydbg에서는 실행되는 모양 🤔


2. 흐름 확인

F7, F8 단축키를 통해 프로그램 실행 흐름을 파악할 수 있다.


EAX, ESI 두 레지스터의 값을 비교하여 두 값이 동일할 경우 CD-ROM으로 인식했다는 알림창을 띄워준다.

이때, EAX는 GetDriveTypeA 함수의 리턴값으로, 리턴 직후 값은 3이다. 이 리턴값에 따라 드라이브를 판별한다.

3. 정답 확인

GetDriveTypeA 함수

76FA69F0 > 8BFF             MOV EDI,EDI                              ; 01.<ModuleEntryPoint>
76FA69F2   55               PUSH EBP
76FA69F3   8BEC             MOV EBP,ESP
76FA69F5   83EC 0C          SUB ESP,0C
76FA69F8   56               PUSH ESI
76FA69F9   8B75 08          MOV ESI,DWORD PTR SS:[EBP+8]
76FA69FC   57               PUSH EDI
76FA69FD   85F6             TEST ESI,ESI
76FA69FF   74 34            JE SHORT KERNELBA.76FA6A35
76FA6A01   8BD6             MOV EDX,ESI
76FA6A03   8D4D F4          LEA ECX,DWORD PTR SS:[EBP-C]
76FA6A06   E8 31990000      CALL KERNELBA.76FB033C
76FA6A0B   85C0             TEST EAX,EAX
76FA6A0D   74 21            JE SHORT KERNELBA.76FA6A30
76FA6A0F   8B45 F8          MOV EAX,DWORD PTR SS:[EBP-8]
76FA6A12   50               PUSH EAX
76FA6A13   E8 488D0000      CALL KERNELBA.GetDriveTypeW
76FA6A18   8BF8             MOV EDI,EAX
76FA6A1A   85F6             TEST ESI,ESI
76FA6A1C   74 0A            JE SHORT KERNELBA.76FA6A28
76FA6A1E   8D45 F4          LEA EAX,DWORD PTR SS:[EBP-C]
76FA6A21   50               PUSH EAX
76FA6A22   FF15 40F00977    CALL DWORD PTR DS:[<&ntdll.RtlFreeUnicod>; ntdll.RtlFreeUnicodeString
76FA6A28   8BC7             MOV EAX,EDI
76FA6A2A   5F               POP EDI
76FA6A2B   5E               POP ESI
76FA6A2C   C9               LEAVE
76FA6A2D   C2 0400          RETN 4

76FA6A13 오프셋에서 호출하는 GetDriveTypeW 함수는 드라이브 유형을 정수로 리턴한다. 마이크로소프트 공식 페이지에서 리턴값을 확인할 수 있다.

01번 문제는 CD-Rom으로 인식시키기 위핸 GetDriveTypeA의 리턴값을 찾는 문제였으므로, 리턴값 EAX는 5가 되어야 한다.


4. 코드 변조


그럼 리턴된 EAX값을 5로 변조하면 성공 알림창이 나올까? 윈도우 10 기준으로는 아니다 ^_ㅠ...


JE 문에 브레이크포인트(F2)를 걸어주고 프로그램을 실행시킨 결과, EAX1, ESI0041003이 저장된 것을 확인할 수 있다.
ESI의 경우, 윈도우7에서는 0부터 시작하지만, 윈도우10에서는 시작 주소가 부여되는 것으로 보인다.

GetDriveTypeA 함수에서 리턴된 값을 5로 변조하여도 EAX=3, ESI=0041003 이기 때문에 CMP의 결과가 거짓이라고 판단, JE문을 건너뛰고 에러 메세지 출력 함수가 실행된다.


CD-Rom 알림창을 띄위기 위해 JE문의 플래그를 변조해보자. Ollydbg 우측 Registers 화면에서 변경할 수 있다.

CMP 결과 두 레지스터 값이 같을 경우 ZF(Zero Flag)는 참(1)이 된다. 따라서 다음과 같이 ZF 플래그를 1로 변경한다.


플래그값 변조 후 프로그램을 다시 실행해보면 CD-Rom으로 인식되었다는 알림창을 확인할 수 있다.

기타 풀이 방법

이외에도 JE 구문을 JNE 구문 (CMP 결과 두 레지스터 값이 일치하지 않을 경우)으로 변경하는 방법 등, 다양한 방법이 있다.

codeengn에서 다양한 해설을 깃허브에 모아뒀으니 확인하며 여러가지 문제 풀이 방법을 찾아보는 것도 좋을 것 같다.

profile
🔥

0개의 댓글