CodeEngn에서 기초중의 기초인 Basic 1번문제를 풀어봅시다.

http://codeengn.com/challenges/



HDD(하드디스크)를 CD-Rom으로 인식시키기 위해 GetDriveTypeA의 리턴값을 알아내라고 하는군요!

사실 GetDriveTypeA의 리턴값은 이번 리버싱 문제를 풀지 않고서도 알아낼 수 있습니다.


https://msdn.microsoft.com 로 접속을 한 후 

검색창에 GetDriveType를 입력해봅시다.


(MSDN이란? Microsoft Developer Network의 약어. 윈도 응용 프로그램의 개발자들을 위해 정기적으로 다양한 정보를 발신하는 등록제 서비스)



GetDriveType 함수에 관한 설명이 나옵니다. 

해석해보자면 disk drive의 Type을 결정한다고 이해할 수 있겠네요




위의 사진은 Return값에 따른 Drive의 Type입니다. 

HDD의 리턴값은 '3' 이며 CD-Rom의 리턴값은 '5' 임을 알 수 있습니다.

CodeEngn이 요구하는 문제의 답을 알았지만, 다운로드한 파일로 문제를 풀어보도록 하겠습니다.







1번문제를 실행한 결과입니다.


첫번째 메시지박스 : 너의 HD를 CD-Rom 으로 인식시켜라

두번째 메시지박스 : 하.. 이건 CD-Rom이 아니잖아!


첫번째 메시지박스는 이 문제의 요구사항이며

두번째 메시지박스는 문제를 풀지 못했음의 Error문입니다. 문제를 푼다면 다른 메시지 박스가 나오겠죠?


올리디버거에 적용시켜봅시다.






다른 파일에 비해 현저히 적은 코드가 나오네요.

이 1번문제는 문제를 위해 어셈블리어로만 코딩을 했다는 소리를 들어본것 같습니다.


 여담은 그만하고 GetDriveType의 리턴값을 알아보기 위해 00401010주소에 Break(F2)를 걸고 실행을 시켜보겠습니다.



레지스터의 값을 확인해보면 현재 EAX값이 3이므로 HDD의 Return value는 '3' 임을 알 수 있습니다.



위의 어셈블리 코드를 차례대로 실행(F8)하다보면 EAX값은 두번 내리고, ESI값은 세번 올려 

결과값은 EAX: 1,  ESI:3 임을 알 수 있습니다.


이후 CMP로 EAX, ESI의 값을 비교한 후 

JE로 값이 다를 경우 Error문의 주소로, 값이 같을경우 YEAH! 부분으로 가는것을 알 수 있는데, 

값이 참이기 위해서는 EAX의 값이 2가 더 커야합니다.


해석하자면 본래의 EAX값(HDD의 Return value)은 3이였으니 CD-Rom으로 인식받기 위해서는 2의 값이 더 커져야 한다는 것입니다.

그러므로 CD-Rom의 Return value는 '5' 임을 알 수 있습니다. 






CodeEngn의 문제는 풀었지만 심심하니 진도를 더 나아가 보도록 하겠습니다.

우리가 원하는 메시지 박스를 소환해보도록 합시다.




현재 상황으로는 값이 다르므로 무조건 Error문으로 가겠죠?

우리가 원하는 메세지박스의 주소인 0040103D로 가게끔 수정해 봅시다.



첫번째 방법입니다.

CMP EAX, ESI -> CMP EAX, EAX

값이 같을 수 밖에 없게 EAX, ESI를 EAX, EAX로 바꾸는 것입니다. 

물론 CMP ESI, ESI로 해도 가능하겠죠?


(수정은 더블클릭 하면 원하는 어셈블리 명령어로 수정할 수 있습니다.)


<더블클릭시 나타나는 창>





두번째방법입니다.

JE SHORT 0040103D -> JMP SHORT 0040103D

값이 같으면 0040103D로 점프하는 조건분기인 JE를 아무런 조건없이 점프할 수 있도록 JMP로 수정하는 방법입니다.





지금까지 1번문제를 풀어봤습니다. 1번문제인 만큼 확실히 쉬웠네요. 

이해가 안되시거나 잘못된것이 있다면 알려주시길 바라며!

다음엔 2번문제로 찾아뵙겠습니다.


+ Recent posts