Never Stop Running

[CodeEngn] BASIC 01 본문

Training/Codeengn

[CodeEngn] BASIC 01

Gyoran 2018. 9. 24. 08:46

리버싱 공부를 위한 문제풀이로

정답을 찾는 것과는 조금 다를 수 있습니다.

[CodeEngn] BASIC 01


문제 풀이 환경

Windows 10 / Intel / x32dbg

 문제 URL

https://www.codeengn.com/challenges/basic/01


BASIC 1번 문제.

문제는 HDD를 CD-Rom으로 인식시키기 위한 GetDriveTypeA 함수의 리턴값을 찾는 것이다.

일단 HDD를 CD-Rom으로 인식시키는 방법들을 찾아본다.


 

 

일단 파일을 실행시키면 이러한 창 두개가 뜬다.


x32dbg로 열어본다.

참고로 [설정] - [환경설정] - [이벤트]에서 시스템 중단점, TLS 콜백을 체크 해제한 상태이다.

GetDriveTypeA 함수가 보이기 때문에 함수 내부로 들어가기 전에 Break Point를 건다. 그리고 밑의 코드를 보면 CMP로 EAX와 ESI를 비교하여 둘 중 하나의 창을 띄우기 때문에 CMP 전에도 Break Point를 건다.

CMP 하기 전에 EAX = EAX-2와 ESI = ESI+3만 할 뿐 EAX나 ESI 값을 설정해주지는 않는다. 그래서 GetDriveTypeA 함수에서 설정해준다고 생각을 했다.


어찌되었건 GetDriveTypeA 함수에서 나오면 EAX는 3, ESI는 401000의 값을 가지고, EAX = EAX-2와 ESI = ESI+3을 하기 때문에 CMP에 다다랐을 때는 EAX = 1, ESI = 401003의 값을 갖는다.


따라서, 두개의 값이 다르므로 JE(Jump Equal->비교 값이 같으면 점프)의 조건에 맞지 않고 점프를 하지 않아 Error 메세지가 나타난다.




우리는 CD-Rom이라는 창을 띄우기 위해 점프를 해야하기 때문에 두개의 값을 맞춰주거나, CMP문을 바꾸거나, JE문을 바꾸어 점프를 하게 할 수 있다.

추가로 캡쳐하지는 않았으나, CMP에서 값을 비교할 때는 두 숫자값을 빼고 만약 0이라면 ZF를 1로, 음수라면 SF를 1로 바꾸어 나타낸다. 따라서 같을 경우 ZF가 1로 세팅된다. JE문은 ZF가 1일 경우 점프이므로 JE문 앞에서 ZF를 1로 바꿔주어도 점프를 할 수 있다.


첫번째, 두 값을 맞춰주기 위해 EAX의 값을 CMP문 바로 앞에서 401003으로 바꾸어 ESI와 동일한 값으로 만들어준다.


정상적으로 점프문이 활성화되었다.


두번째, CMP문을 바꾼다. 동일한 값을 비교하게 만들어 두 값을 뺐을 때 0이 되게 만들고 ZF를 1로 만들어 JE 조건에 맞게 한다.


정상적으로 점프문이 활성화되었다.


세번째, 점프문 조건을 바꾼다. CMP에서 같지 않다는 결과가 나오므로 같지 않을 때 점프를 하게 JNE(Jump Not Equal)로 명령어를 바꾼다.


정상적으로 점프문이 활성화되었다.


결과적으로 CD-Rom이 맞다는 창이 뜬다.




문제가 요구하는 것은 GetDriveTypeA 함수의 리턴값을 조작하여 점프를 하게 만드는 것이므로 첫번째 방법이 맞다. 따라서 CMP문에서 EAX가 401003이 되려면 GetDriveTypeA 함수의 리턴값은 401005가 되어야 한다. 앞의 401000은 코드부분의 주소이므로 답은 5이다.


'Training > Codeengn' 카테고리의 다른 글

[CodeEngn] BASIC 06  (0) 2018.09.24
[CodeEngn] BASIC 05  (0) 2018.09.24
[CodeEngn] BASIC 04  (0) 2018.09.24
[CodeEngn] BASIC 03  (2) 2018.09.24
[CodeEngn] BASIC 02  (0) 2018.09.24
Comments