안경잡이 구루루

[CodeEngn] Basic RCE L01 본문

리버싱(Reversing Engineering)/CodeEngn ( 코드엔진 )

[CodeEngn] Basic RCE L01

구루루(gururu) 2020. 6. 22. 22:34
반응형

https://codeengn.com/challenges/

 

CodeEngn.com [코드엔진] - Challenges

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰

codeengn.com

위 링크를 통해 다운 받을 수 있습니다.

< 준비물 >

ollydbg201,  실행파일, 

 

< 풀이과정 >

처음 실행 화면

우선  f9를 눌러 실행시켜 본다.

위 같은 메세지박스를 나타낸다.

문제는 hd를 cd-rom으로 인식하도록 만들어야 한다. 그러기 위해 위를 포함한 메세지를 통해 문제를 풀고자 한다.

처음 실행 화면을 보면 알 수있지만 별로 큰 실행파일이 아니라서 한 화면에 모든 실행메세지를 확인할 수 있다.

그렇기에 한 화면으로 정리하자면 아래와 같이 나타낼 수 있다.

실패, 성공을 결정하는 여부가 메세지 이전에 있다고 가정하고 리버싱을 하고자 한다.

우선 cd-room을 판단한다고 가정한 곳함수 GetDriveTypeA 를 살펴보자

msdn 에서 제공하는 getdriveytypea 로 한글번역을 해서 약간을 해석이 이상하지만 보는데는 문제없다.

보면 cd-room 으로 인식하기 위해서는 5를 출력해야한다.

다시 ollydbg로 넘어와서 cd-room 판단 부분과 실패,성공 메세지 출력 부분에 브레이크포인트를 걸어 그때의 레지스터의 값을 살펴보자

그치만 getdrivetypea를 실행한 후 레지스터를 살펴보면 그 함수 결과의 값인 eax의 값에 00000003이 들어간걸 볼 수있다.

추가로 함수 밑 명령어들을 분석해 보면  INC, DEC를 이용해 여러 연산을 한 후  EAX, ESI의 CMP의 결과에 따라 JE를 해서 성공, 실패 여부를  결정시킴을 예상할 수 있다.

여기서 확실히 알 수 있는 점은 EAX가 ESI에 따라 결과가 달라짐을 알고 이 둘을 수정해야된다고 생각했다.

+)  CMP 인자1 ,인자2

: 인자1 - 인자2  결과 0( zero) 로 서로 같으면 제로플래그( ZF )를 1로 설정

+)  JE 주소

: Equal 이면 지정 주소로 jump

 

다시 문제로 넘어와서  최종판단 부분인  JE 0040103D를 보면 ZF=1일 때 JUMP 하는 주소는  성공 MessageboxA의 주소로 간다.

그렇다면 CMP EAX, ESI 부분을 ZF=1로 만들기 위해 EAX와 ESI의 값을 같게 만들어야하는 결론을 얻는다.

 

그래서 INC, DEC하는 부분의 명령 부분을수정해서  MOV ESI, 3을 넣어 EAX의 값과 같도록 만들었다.

위 결과 CMP의 결과 ZF=1이 만들어지고 결국 아래 그림처럼 성공 MessageboxA 명령문으로 JUMP 된다.

 

이후 실행( F9 )를 눌러보면 

짜잔하고 성공하게 된다. 

반응형

'리버싱(Reversing Engineering) > CodeEngn ( 코드엔진 )' 카테고리의 다른 글

[ CodeEngn ] Basic RCE L03  (0) 2020.07.03
[CodeEngn] Basic RCE L02  (0) 2020.07.03