문제분석 & 풀이
자바스크립트 게임이고 해킹해서 게임을 클리어 할 수 있는지 묻고 있다.
비행기 게임이 나온다.
우선 게임을 플레이해보자.
죽으면 31337점을 달성하라는 문구가 나온다.
아마도 31337점을 달성해야 클리어 되는 것 같다.
나는 게임 실력이 형편없기 때문에 실력으로 31337점을 달성하기는 힘들 것 같아서 개발자도구(F12)로 코드를 확인했다.
<script> 태그를 확인하면, 자바스크립트 코드가 난독화 되어있다.
자바스크립트 난독화 해제 사이트를 이용해서 코드 난독화를 해제하고 확인했지만, 변수명들이 복잡하게 구성됐다.
코드를 최상단에 _0x32bb 배열 안에 여러 변수들이 hex로 저장된 것을 확인할 수 있는데, 아래 코드들을 쭉 보면 사용하는 변수들이 모두 _0x32bb 배열 안의 변수들로 구성됐다.
따라서 _0x32bb 안의 변수들이 중요하다고 생각했고 개발자도구의 console 기능을 활용해서 배열 안의 변수들을 [그림]처럼 확인했다.
총 58개의 변수가 저장됐는데, 목표는 점수를 31337점으로 바꾸는 것이기 때문에 "&score=" 변수가 중요해 보인다. 중요하다고 생각한 이유는 score 파라미터를 이용해서 점수를 서버에 전송할 것 같다고 생각했기 때문이다.
변수의 인덱스가 43이라는 것을 확인했으니 코드에서 이것을 검색해보자.
코드에서 1번만 사용된다는 것을 알 수 있었고 이 부분을 집중 분석했다.
분석하기 전에 코드의 구성을 대충보면 ajax를 이용해서 서버와 통신했을 것 같은 느낌이든다.
이전에 구했던 _0x32bb 변수와 대입해서 코드를 변환하면 [그림]과 같이 ajax 통신으로 score를 등록하는 것을 확인할 수 있다.
high-scores.php에
token=token&score=BTunnelGame["getScore"]()
를 전송하면서 score 기록한다.
그렇다면, score를 조작해서 31337점이 기록되도록 하면 문제가 해결 될 것이다.
score=BTunnelGame["getScore"]()
BTunnelGame 함수를 이용해서 현재 게임에서 기록한 점수를 가져온다. 따라서 이것을 지우고 31337점을 score로 전송하게 코드를 변경하면 된다.
score=31337
코드를 바꿔보자.
코드를 변경하고 복사한다.
복사한 코드를 console 창에 붙여넣고 페이지의 코드를 바꿨다.
게임을 시작해서 바로 죽어보면?
flag가 나온다.