아메바시큐리티

[Basic RCE 1] 본문

리버싱/codeengn

[Basic RCE 1]

am2ba 2021. 4. 30. 11:39

문제

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

 

5

 

풀이

 

open with windbg

위의 그림은 windbg를 이용해 해당 문제 파일을 열어본 결과이다. 

코드를 분석해보면, GetDrvieTypeA를 호출한후, esi에 +3, eax에 -2를 해준 결과를 비교한다.

해당 결과의 값이 같다면, CD-ROM으로 인식하는 것을 알 수 있다. 

 

기본적으로 함수의 Return값은 EAX 레지스터에 기록되므로, BreakPoint를 이용하여 해당 함수의 현재 return값을 확인해보자.

GetDriveTypeA이후 Register 상태

현재 GetDriveTypeA를 실행하면 return값이 3이 되는 것을 알 수 있다. 

이제 해당 코드를 비교하는 cmp까지 진행한 후 다시 레지스터의 상태를 확인해보자. 

cmp를 진행할 때 Register 상태

CD-ROM으로 인식하기 위한 조건은 EAX와 ESI의 값이 같은 것이다. cmp를 진행할 때 EAX의 레지스터 값이 3이면 CD-ROM으로 인식하게 된다. 

GetTypeDriveA 이후에 EAX레지스터의 값을 2 감소시키므로, GetTypeDriveA의 리턴이 저장되는 EAX의 값은 00401005일 경우 CD-ROM으로 인식한다. 

 

답안을 401005로 제출하였더니, 답이 틀렸다고 한다. 정확한 원인은 모르겠지만 해당 문제는 32bit 실행파일이고, 현재 문제를 풀고 있는 pc의 환경은 64bit이다 보니, 문제가 발생한 것 같다. 

VM을 이용해서 32bit를 사용하고 있는 win7에서 다시 실행해보도록 하자. 

32bit win7에서 레지스터 값

32bit 운영체제에서는 ESI의 값이 00401000에서 시작하는 것이 아닌 00000000에서 시작하는 것을 알 수 있다. 

따라서 GetDriveTypeA의 return값이 5인 경우 해당 CD-ROM으로 인식하게 된다.

 

'리버싱 > codeengn' 카테고리의 다른 글

[Basic RCE] 14번  (0) 2021.05.17