본문 바로가기

[Riversing]/[코드엔진] BASIC

[코드엔진] Basic1

코드엔진 Basic1 을 풀어보자.

 

우선 코드엔진 사이트에 들어가 challenges 탭의 basic1 문제를 다운받는다.

(무료임)

 

파일을 다운받고 압축을 풀어야 하는데 password 가 걸려있다.

사이트에 친절하게 나와있다. ( PW : codeengn )

 

압축을 풀고 실행파일을 실행해보면 아래와 같은 창이 뜬다.

CD-Rom 으로 생각하게끔 만들라고 한다.

중요한 말인 것 같으니 기억한다.

 

확인 버튼을 누르면

 

 

이건 CD-Rom이 아니잖앗! 

하며 프로그램이 끝난다.

 

문제파악은 끝났다. 이 실행파일의 어딘가에서 Drive가 어떤건지 판별하는 부분을 찾아 CD-Rom 이라고 판단하게끔 수정하면 될 것 같다.

 

OllyDbg를 이용해 분석해보자.

일단 F8을 눌러 쭉 진행해본다.

그러면 00401018 주소에서 MessageBow가 호출되며 

위와 같은 박스가 호출된다. 아까 실행할때 나왔던 이 호출박스가 저 주소에서 호출되는것이다.

일단 계속 진행해보자.

쭉쭉 내리다 보면

00401024 주소에서 EAX 와 ESI 를 비교하고 그 밑에 JE 분기문이 있다.

딱 보니 여기서 drive를 비교하고 CD-rom이 아니면 error 로, CD-rom 이 맞으면 YEAH! 로 보내는것이다.

(EAX 와 ESI가 다르면 error, 같으면 YEAH!)

 

일단 계속 눌러보니 JE 분기문(만약 비교대상 둘이 같으면 jump) 에서 Jump is NOT taken 이라며 날 에러부분으로 보내버리며 프로그램이 종료된다.

 

그렇다면 우리는 00401026 의 점프분기문이 이루어지도록 조작하면 문제를 풀 수 있을것같다.

 

디버깅을 다시 시작(Ctrl+f2)한 뒤 마우스 클릭 혹은 키보드화살표를 이용해 00401026 주소를 선택한다.

그리고 스페이스바를 누르면 아래와 같이 명령어를 수정 할 수 있는 창이 뜬다.

 

나는 지금 점프가 안 이루어지는걸 이루어지게 하고 싶기 때문에

JE (Jump if Equal) 대신에 JNE (Jump if Not Equal) 로 바꿔준다.

이렇게 명령어를 수정하고 Assemble 버튼을 누르면 아래와 같이 바뀌는데

JNE 를 알아서 JNZ 라고 수정해줬다. (같은의미임)

 

여튼 수정을 다 끝냈으니 F9 키를 눌러 진행시키면 

아래와 같이 해결된다.

 

 

basic1 이라 그런지 상당히 간단한 문제였다.

내가 푼 풀이 말고도 다양한 풀이방법이 있으니 시도해보면 좋을 것 같다.

'[Riversing] > [코드엔진] BASIC' 카테고리의 다른 글

[코드엔진] basic6  (0) 2020.03.25
[코드엔진] basic5  (0) 2020.03.25
[코드엔진] basic4  (0) 2020.03.24
[코드엔진] basic3  (0) 2020.03.24
[코드엔진] basic2  (0) 2020.03.16