코드엔진 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 |