본문 바로가기

Reverse Engineering/CodeEngn - Writeup

[CodeEngn RCE Basic] L01

반응형

CodeEngn RCE Basic L01 해설 시작합니다^^

저의 해설은 정답을 찾는 방향과 구조같은 것들을 함께 해설을 할 예정입니다


일단 문제를.. 보면?

GetDriveTypeA의 Return 값을 알아내라고 하네요!


정답을 찾는 첫번째 방법

MSDN 사이트를 참조해서 CD-ROM의 Return 값을 찾아본다.

MSDN 사이트 연결

해서 GetDriveTypeA를 검색해보면..?


음... 답이 여기 있네요?

근데 우리는 이러자고 리버싱 하는거 아니잖아요?


정답을 찾는 두번째 방법

JMP문을 사용한다.


일단.. Ollydbg로 내부 구조를 뜯어봅니다.

응?
뭐지?

(일단 이 강좌는 기초적인 리버싱 능력을 가지고 있다는 전제하에 작성하겠습니다.)


일단 이 프로그램 내부를 분석하겠습니다.


1. 일단 MessageBoxA를 호출해서 MessageBox를 띄웁니다.

2. c:\를 00402094에 PUSH 한 후에 GetDriveTypeA를 CALL합니다.

3. ESI값 1 증가 -> EAX값 1 감소 -> 00401021로 이동 -> ESI값 1 증가 -> ESI값 1 증가 -> EAX값 1 감소

4. EAX값과 ESI값을 비교(CMP[Compare])합니다.

5. 만약 EAX값과 ESI값이 같다면, 0040103D로 이동한다

6. 만약 아니라면 00401028로 진행하고 틀렸다는 MessageBox를 띄웁니다.

7. 만약 맞다면 0040103D로 이동하게 될 것이고, 올바르게 인식되었다는 MessageBox를 띄웁니다.

8. 프로세스 종료 (ExitProcess)


이제 여기서

어느 부분을 바꿔서 어떠한 경우에도 올바르게 인식되었다는 MessageBox를 띄우게 하겠습니다.


아까 5번에서 JE SHORT Reverse_.0040103D라는 문구에서

JE란 (Jump if Equal)을 의미하는데 이는 두 값이 같을 경우를 뜻합니다. (조건문)

이를 JMP 0040103D로 바꿉니다. (JMP : 조건 없이 그냥 점프)

그러면 어떠한 경우에던지 간에 올바르게 인식되었다는 문자를 띄울 수 있습니다.


근데

"이 해결 방법은 그냥 올바르게 인식되었다고 하는 문자를 띄우게 하는게 목적입니다."

라고 전 하고 싶습니다. 

그러면... 만약에 정답을 찾으려면..요?


정답을 찾는 세번째 방법

Dump 부분을 수정해서 EAX값을 확인한다.


여기서.. EAX란?

EAX는 간단하게 말해서 함수의 반환값이 저장되는 부분입니다.

그러니깐 GetDriveTypeA 함수의 반환값을 여기다가 저장한다는 소리이지요 ㅋㅋ


여기서 이 부분을 자세히 한 번 봅시다.


여기서 00402094의 값은 Dump 위치를 나타내는데 이를.. 확인해보면?


이제 문제를 풀기 위해서 C:\를  D:\ (컴퓨터의 사정에 따라 다를 수 있습니다) 로 바꿔서 하면.

이렇게 바뀐 것을 확인할 수 있고.


이를 F8로 하나하나 돌려보거나 00401026 에 BP를 겁니다.

그리고 EAX값을 확인해 보면..?


""


를 확인하실 수 있습니다 ㅋㅋ

(정답은 공개하지 않겠습니다) -> 다 공개해 놓고선...ㄷㄷ


이상 착한아이였습니다 ㅋㄷㅋㄷ

질문 있으시면..? 댓글로 해 주십시요

 







반응형

'Reverse Engineering > CodeEngn - Writeup' 카테고리의 다른 글

[CodeEngn RCE Basic] L03  (1) 2013.02.19
[CodeEngn RCE Basic] L02  (0) 2013.02.14