Basic RCE L01

hoon·2023년 5월 17일
0

CodeEngn

목록 보기
1/21

문제

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

파일을 실행해보면 HD를 CD-Rom으로 생각하게 만들라고 하고 에러 메시지를 띄어준다.

우선 해당 파일이 32bit 파일인지 64bit 파일인지 확인

32bit 파일임을 알 수 있음

IDA 분석

esi + 3한 값과 GetDriveTypeA을 통해 나온 결과(eax) -2 를 비교한 뒤에 eax-2 == esi + 3 이면 HD를 CD-Rom으로 인식하는 것을 알 수 있다.

더 자세한 분석을 위해 x32dbg를 사용했다.

esi에는 EntryPoint값인 401000이 들어가고 eax는 GetDriveTypeA의 return 값이 들어온다.

GetDriveTypeA

UINT GetDriveTypeA(
  [in, optional] LPCSTR lpRootPathName
);

또한 결과 값을 다음과 같다.

현재는 1이 반환되니 DRIVE_NO_ROOT_DIR임을 알수 있고 CD-Rom으로 인식되면 리턴값이 5여야되지만 문제에서는 eax(1) - 2 == 401003이 되야 하니 리턴값이 401005가 되어야한다.
(원래는 esi에 0이 들어있어야되고 MS에서 정의된것처럼 eax = 5가 되게 리턴값이 반환되면 CD-Rom으로 인식되어 문제가 해결됨 본인 디버거 플러그인 설정 문제 때문일 수 있다고 생각됨)

주소값 401024 부분 opcode를 cmp eax, esi -> cmp eax, eax 로 바꾸는 바이너리 패치를 통해 실행만으로 통과되게 바꾸었다.

[patched file]
[patch result]

0개의 댓글