본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2020.05.14] CSAW365 | Gametime

| Gametime

Reversing.kr의 문제들이 너무 어려워서 이번엔 사이트를 바꿔보았다.

CSAW 365라는 워게임 사이트의 Gametime 문제를 풀어보겠다.

 

파일을 실행시키면 다음과 같은 게임이 실행된다.

 

카운트다운이 된 후 출력되는 문자에 따른 키를 누르면 되는 게임이다.

s -> Space Bar, x -> x, m -> m

만약 잘못 눌렀을 경우 프로그램이 종료된다.

 

| OllyDbg

올리디버거를 사용해 프로그램을 열었고 오른쪽에는 실행 창을 띄웠다.

표시한 부분을 보면 특정 주소로 Jump하는 것을 알 수 있다.

 

해당 부분을 미리 살펴보니 특별한 내용,

이를 테면 Return으로 빠져나가는 것과 같은 행위는 없어서 그대로 따라가도록 한다.

 

계속 내리다 보면 문자열들을 출력하는 걸 알 수 있다.

 

그 중에는 원래 프로그램만 실행했을 때는 보이지 않던 문자열도 볼 수 있다.

아마 몇 개의 과정을 지나면 not이 빠지고 key is ~가 출력되는 것 같다.

 

해당 부분을 지나면 카운트 다운이 시작된다.

 

표시한 부분에서 특정 함수를 call하며 문제가 출제되고

 

틀릴 경우 기존에 프로그램이 종료되는 것과는 달리

UNDER FAILURE이라는 문자열이 출력된다.

 

아래로 조금 내려가면 Jump 문이 나온다.

도착지점을 확인해보니 결국 Return으로 프로그램을 종료시키는 것을 알 수 있다.

 

따라서 Jump를 비활성화 시키기 위해 Z플래그를 0으로 고쳐준다.

JE : 같을 때 점프  제로 플래그가 1일 때 점프

 

좀 더 내려가면 같은 구조가 반복되는 것을 알 수 있다.

* 함수호출 > 문제 출력 > 틀릴 시 Jump문 활성화

이 또한 Z플래그를 0으로 수정하여 Jump 문을 비활성화 시킨다.

 

이 과정을 한번 더 거치면(m) 이전과 마찬가지로 key is not()이 출력된다

 

아래로 조금 내려가면 다음의 반복문이 나오는데 이는 단순히 줄을 띄우기 위한 것으로

제로플래그를 변경하여 뛰어 넘는다.

 

그 아래에서는 또 다른 반복문이 수행되는데 위에 나온 문제를 반복적으로 출제한다.

 

중간에 ‘TURBO TIME’이라는 문자열이 출력된다.

(뭔가 중요한 부분 같은데 몰라도 문제 푸는 데에는 지장이 없다.)

 

중간에 또 다른 반복문에 나오는데 여기서! 이번에는 key is not이 아닌 key is ()의 형태를 띈다.

키값을 끝까지 출력하기 위해 이번에는 제로 플래그를 바꾸지 않고 끝까지 반복문을 실행한다.

 

전체 키가 출력되면 반복문이 종료된다.

 

이후에도 계속 문제가 출력되는데 아마 실제 프로그램에서는 이 해당 키가 출력되지 않는 것 처럼 보이는 것 같다.

(알고보니 전체 문제를 다 풀면 키가 출력된다고는 함)

 

근데 문제가 너무 쉽고 어이없어서 이 플래그가 맞나 하고 넣어보니 정답이긴 하다…

해결하고도 찝찝