IT 블로그 !!

Code Engine Basic 1 본문

Reversing/Code Engine

Code Engine Basic 1

IT_Try 2018. 10. 4. 08:22

코드엔진 문제 중에서 Basic 1번을 풀어보겠습니다.



HDD(하드)CD-ROM으로 인식시키기 위해서는 GetDriveTypeA의 리턴 값이 무엇이 되어야 하는가?


자 우선 올리디버그를 열어서 문제를 살펴보도록 합시다.



예상과 달리 코드가 매우 짧습니다.

F9를 눌러서 함수를 실행시켜 보면


[그림 1] 

[그림 2]



그림 1에서는 너의 HDCD-ROM으로 인식시키라는 뜻이고

그림 2는 인식시키지 못했으므로 Error가 난 것입니다. 우리는 이제 Error가 나지 않게끔 문제를 풀어 봅시다.



위 코드에서 00401000부터 00401000E“Make me think your HD is a CD-ROM”의 메시지 창을 띄우는 코드입니다.

문제에서 GetDriveTypeA의 반환 값을 물어봤으니 GetDriveTypeA의 바로 밑에 줄에 Break(F2)를 걸고 반환 값을 살펴봅시다.



보듯이 현재 GetDriveTypeA의 반환 값은 3입니다.

현재 GetDriveTypeA의 반환 값이 3이라면 아까와 같은 Error 메시지 창이 뜰 수밖에 없습니다.

원인을 살펴보면 아래와 같은 명령어들을 볼 수 있습니다.



위의 어셈블리 코드들을 계속 실행하다 보면

EAX의 값은 2번 감소시키고, ESI의 값은 3번 증가시키는 코드가 나옵니다.

그리고 바로 다음 CMP EAX, ESI 코드가 나오게 됩니다.

 

 CMP [1], [2] = 1과 값2를 비교하여 두 값이 같으면 1 다르면 0ZeroFlag에 대입합니다.

그러나 현재 두 값이 다르므로 Z에는 0이 대입되어있습니다.



JE [주소] = ZeroFlag의 값이 1일 경우 해당 주소로 점프합니다. 그러나 0이므로 JE명령문에서 점프를 하지 않고 그대로 실행함으로써 Error문자열이 출력됩니다.

 

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

본래의 EAX(HDD의 반환 값)3이었으니 CD-ROM으로 인식받기 위해서는 2의 값이 더 커져야한다는 것입니다.

그러므로 CD-ROM의 반환 값 은 ‘5’임을 알 수 있습니다.

 

나는 CMP EAX, ESI -->> CMP EAX, EAX로 바꾸어서 문제를 풀어보겠습니다.

(물론 CMP ESI, ESI로 바꾸어도 된다. 중요한 것은 두 값이 같도록 만드는 것이다)



(CMP EAX, ESI로 되어있는 부분을 더블클릭하면 수정이 가능합니다.)

Assemble을 눌러줍니다.



그 후 F9를 눌러 주면은


이러한 창이 뜨면서 문제를 해결할 수 있습니다.





'Reversing > Code Engine' 카테고리의 다른 글

Code Engine Basic 6  (0) 2018.10.12
Code Enigne Basic 5  (0) 2018.10.12
Code Engine basic 4  (0) 2018.10.07
Code Enigne Basic 3  (0) 2018.10.07
Code Engine basic 2  (0) 2018.10.04