728x90
◾ 실행환경: IDA pro(32bit)
코드를 수정해 HD를 CD-Rom이라고 생각하는 메시지가 출력될 수 있도록 한다.
(원본 캡쳐본들이 날아갔다..)
수정한 부분은 loc401021에서 가장 마지막 점프 브랜치 명령이다. 원본 코드에서는 eax, esi 값을 비교하고 je short loc_40103D였다. 바로 위 cmp 명령코드부분에 breakpoint를 걸고 실행해보면,
이렇게 eax 레지스터와 esi 레지스터의 값이 다르다. 이 때 두 가지 방법이 있는데,
- breakpoint를 걸고 실행 중 eax 레지스터의 값, 혹은 esi 레지스터의 값을 변조하여 서로 같게 만들어 je 조건에 통과해 loc_40103D를 실행할 수 있도록 한다.
- eax, esi 레지스터의 값을 변조하지 않을 경우, 결과 값이 같지 않다 인 경우 점프할 수 있도록 je 명령을 jne로 바꾼다
문제에서 GetDriveTypeA의 리턴값이 무엇이 되어야하는지에 대한 답을 요구하고 있으므로 이에 대한 풀이도 접근을 해보자.
GetDriveTypeA
UINT WINAPI GetDriveType(
_In_opt_ LPCTSTR lpRootPathName
);
Return code | value(정수값) | 의미 |
DRIVE_UNKNOWN | 0 | 알 수 없음 |
DRIVE_NO_ROOT_DIR | 1 | 최상위 경로가 없음 |
DRIVE_REMOVABLE | 2 | 이동식 저장장치 ex. USB |
DRIVE_FIXED | 3 | 고정형 저장장치 ex. HDD |
DRIVE_REMOTE | 4 | 네트워크 드라이브 |
DRIVE_CDROM | 5 | DVD, CD ROM 유형 |
DRIVE_RAMDISK | 6 | Ram Disk |
원본 파일에서 Drive는 HD이므로, 3을 리턴한다. 리턴한 값이 EAX에 저장되어 있는 것을 확인할 수 있다. 따라서, GetDriveTypeA 함수의 리턴값, EAX 값을 5로 바꿔주면 CD-ROM으로 인식되었다고 바꿔줄 수 있다.
SMALL
'Reversing > Reversing (Wargame)' 카테고리의 다른 글
[CodeEngn] BASIC RCE L03 (0) | 2021.05.04 |
---|---|
[CodeEngn] BASIC RCE L02 (0) | 2021.05.04 |
[HackCTF] Handray (0) | 2021.05.03 |
[HackCTF] Reversing Me (0) | 2021.05.03 |
[HackCTF] welcome_rev (0) | 2021.05.03 |