YeoPEVA

코드엔진 basic 1번 문제 공략 본문

#Reversing/CodeEngine

코드엔진 basic 1번 문제 공략

YeoPEVA 2017. 7. 22. 18:46

크흠.. 뭔가 공략이 좀 밀린 것 같아서 포스팅 하러 왔습니다. 

[그냥 밀린게 아닐텐데.. 분명 내일이라 해놓고 엄청 밀렸을텐데..]


[으허헣.. 방학인데 좀 쉬면 안됩니ㄲ..]


여튼, 풀어 둔 코드엔진 문제들이 좀 있으니, 빠르게 포스팅 하고, 다시 문제 풀러 가보겠습니닷

그럼 바로 시작합니다 ^^



으헤헤헤헿 즐거운 리버싱 풀이 시작합니다아아아




문제 확인 


[사진 1 | 코드엔진 문제 확인]


음.. 이번 문제는 HDD를 CD-Rom으로 인식하기 위해서는 GetDriveTypeA의 리턴값이 

무엇이 되어야 하는지 알아봐야 하는 군요, 그리고 밑에 

파일을 받을 수 있으니, 받은 뒤 바로 올리디버거를 돌려보도록 하겠습니다. 



[사진 2 | 실행시, 뜨는 메세지 박스]


우선 프로그램을 실행해보았다. 

Make me think you HD is CO-Rom..

[아 몰라요 저 영어 못한다구욧!!]


내 하드를 CD-ROM으로 생각하게 만들어라 이 소리 인 것 같긴 한데..

일단 확인 버튼 눌러 보겠습니다. 



[사진 3 | 에.. 에러라니]



Nah.. This is not a CD-ROM Drive! 

[에에에에엣!?!??!!?]

ㅇ..에러라니.. 일단 분석을 통해 왜 에러가 뜨는지 확인을 해보도록 합시다..!


문제 풀이 


이제 문제를 확인해보았으니, 직접 풀이를 해보도록 합시다!! 



[사진 4 | 분석 시작]


음.. 일단 한번 둘러보니, MessageBoxA 와 GetDriveType A를 호출하고 있는게 보이네요.. 그리고 

맨 마지막엔 ExitProcess 가 보입니다. 


음.. 일단 메시지박스 api를 통해 Make me think 와, 에러 or 성공 메세지 창을 띄우는 것 같습니다.

그 다음으로는 INC,DEC,CMP,JE 명령어가 눈에 띄네요.

밑에서 분기가 이루어지는 것 같습니다..! 


[ㅁ..뭔가 차라랅삐깎 하지만 별 거 없엉..!]

이라고 자신에게 최면을 건 다음 계속 진행하도록 하겠습니다. 




[사진 5 | Make - 메시지 박스]

위에서 알맞은 인자 값을 넣고 메시지 박스 api를 호출시켜 위와 같은 메시지 창을 띄우는군요!

계속 진행해봅시다!



[사진 6 | GetDriveType A 이후]


음.. 이번엔 GetDriveType A를 통해

어떠한 작업을 시행하는 것 같은데.. 

레지스터에 변동이 있습니다. 확인 해보도록 하겠습니다.


[사진 7 | GetDriveType A 레지스터 값 변동]


GetDriveType A 이후 레지스터 값에 변동이 있습니다.

EIP와 ESP는 그렇다 쳐도, EAX의 값 변동이 눈에 띄는군요.

여기서 ! -> EAX는 리턴 값을 저장하는 용도로 쓰인다 카더라.. 



[사진 8 | 그 후 분기점 진입]


일단.. CMP, JE SHORT 결과, 점프 조건에 통과하지 못했고,

그대로 넘어가게 됬네요, 

일단 계속해서 진행 하도록 하겠습니다.


[사진 9 | 실패]


이제 실패 창이 뜨게 되었습니다 | 분기 실패 

일단.. 어떤 식으로 진행되는지는 알겠습니다. 계속 둘러보도록 합시다.



[사진 10 | Make - 메시지 박스]


우선 레지스터 값을 확인해보니, EAX와 ESI 값에 차이가 있는데,

먼저 EAX의 값의 경우 DEC을 2번 거치면서 1로 바뀌게 되었습니다.

또한 ESI의 경우 INC을 3번 거치면서 값이 3으로 변경 되었구요.

CMP를 보면,  EAX와 ESI를 비교한다고 했으니 이와 관련이 있을 것 같습니다. 

그리고 JE를 통해 조건에 적합하다면 Zero 플래그를 1로, 아니면 위와 같이 0로 하여, 

분기를 하는 것 이겠지요. 


[#발 하기 싫엉...  어셈블리어 개객기....


크흠.. 여튼 계속 진행하도록 하겠습니다. 


[사진 11 | 찾을 API]


그럼 먼저 논란이 되고 있는 GetDriveType A에 대해 알아봅시다!

구글 갓 도와주세요!!



[사진 12 | 구글 갓이 내놓은 MSDN 사이트]

우리의 구글 갓이 순식간에 해당 API에 대해 설명된 MSDN 사이트로 안내를 해주네요!


[고마워요! 스피드 웨ㄱ.. 아니 구글!]

[사진 13 | 구글 갓이 내놓은 MSDN 설명 - GetDriveTypeA]


으음.. 잠깐 이거 리턴 값....??!?!?!??

문제 답을 따른다면 리턴 값은 5이니.. 잠시만 문제 풀렸는데요 [..?!?!??!]



..!??!?! 뭐여 #발?

[이 뭔 개같은 상ㅎ...]


바로 시도해보도록 하겠슴다!


[사진 14 | 문제 해결 - 리턴 시점]

우선 위에서 봤던 GetDriveType A가 값을 리턴한 시점으로 가서.. 


[사진 15 | EAX 레지스터 변경]


우리의 EAX 레지스터의 값을 3에서 5로 바꿔줍시다!


[사진 16 | EAX 레지스터 변경]

레지스터가 성공적으로 변경 되었습니다.
그렇다면 이제 이후로 분기로 진입하면 EAX와 ESI 값이 동일하니 
분기문에서 이제 성공적으로 분기를 하겠지요!


[사진 17 | 분기 성공]

성공적으로 진입 했습니다.


[사진 18 | 분기 성공 -2 ]


올... 분기에 성공 했습니다! 이제 성공 메세지 박스를.. 


[사진 19 | END]


음.. 성공했습니다.


이번 문제는 GetDriveTypeA의 CD-ROM일 경우 리턴 값을 알아보는 문제였습니다.

위 파일에서는 CMP와 JE를 통해 EAX와 ESI 값을 비교했으며,

EAX 값이 5이여야만 ESI의 값과 동일하기 떄문에 

위와 같이 레지스터를 고쳐준 결과 성공적으로 문제를 해결했습니다.


음.. 일단 CMP 에 관한 설명은 추후에 다시 포스팅을 하도록 하겠습니다. 설명이 부족했던 것 같네요.


여튼.. 이제 퇴근이다! 빠빠! 



[에에에에에에에엙]

.... 아참 10일만 이였지. 


꺄하하하랄하핳 문제 풀러 갑니다! 2번 문제에서 다시 뵙겠습니다 ^^!






풀이에 참고한 사이트 


[msdn - Get ~~ 설명] 

https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa364939(v=vs.85).aspx