wargame.kr #6 fly me to the moon | javascript 난독화
start를 눌러주니 웬 게임창이 뜬다.
비행기가 형관선에 안 닿게 유의하면서 조종하여 점수가 31337점이 나와야 게임이 성공한다.
javascript 구문을 우회하여 게임에 성공해야 되는 것 같다.
소스코드의 스크립트 구문은 도통 뭘 말하는 건지 알 수 없게 난독화되어 있다.
▶ 자바스크립트 난독화
자바스크립트는 클라이언트(Client)에서 실행되도록 하는 언어여서 사용자가 웹사이트에 접근하게 되면 해당 스크립트를 그대로 볼 수 있게 된다. 이를 방지하고자 적용하는 기법이다.
(출처 : https://kkamikoon.tistory.com/165 )
이 난독화 된 스크립트 구문을 해독해야 문제의 단서가 보일 것이다.
문제에서 난독화 수준은 문자열로 치환한 정도로,
이를 해독하는 사이트가 있다.
엄청 긴 코드지만 앞부분에서 var _0x8618x6 = 0; 이 부분이 왠지 의심스러워 이 부분만 파보려고 한다.
함수이름들이 이해하기 어렵게 되어있어서 쉽게 납득은 안가지만 저렇게 0이라고 초기화 시켜놓은 것이 왠지 점수를 나타내는 변수일 것 같다.
function secureGame() {
var _0x8618x2 = this;
var _0x8618x3 = true;
function _0x8618x4() {
_0x8618x3 = false;
return true
};
function _0x8618x5() {
return _0x8618x3
};
this['killPlayer'] = function() {
_0x8618x4();
return true
};
this['checkLife'] = function() {
return _0x8618x5()
};
var _0x8618x6 = 0;
변수 _0x8618x6을 선언한다.
function _0x8618x7() {
return _0x8618x6
};
function _0x8618x8() {
if (_0x8618x3) {
_0x8618x6++
};
true(_0x8618x3)이면 변수 _0x8618x6값이 1씩 증가한다.
return true
};
this['getScore'] = function() {
return _0x8618x7()
};
getScore 변수가 _0x8618x6을 리턴하는 _0x8618x7() 함수이다.
this['BincScore'] = function() {
_0x8618x8();
return true
};
true(_0x8618x3)이면 변수 _0x8618x6값이 1씩 증가한다.
이 정도면 이 변수가 점수를 나타내는 것이라고 간주할 수 있을 것 같다.
이 변수값을 31337으로 변경해주고 다시 스크립트문에 넣어주었다.
바로 원래 있던 스크립트 문을 바꿔주었다.
그랬더니 적용되지 않는다. (페이지 소스를 변경할 수 없게 한 걸까 ? 이유는 잘 모르겠다.)
구글링해보니 다들 console창에서 수행을 한다. 원본 소스를 변경하지 않고도 console창에 소스를입력만 해도 실행이 가능하다고 한다.
+) 피드백
개발자 도구 Element에는 이미 정의된 난독화 코드에 대한 값이 있다.
그래서 Element에 값을 아무리 바꿔주어도 이미 저장되어 있는 요소이고, 동적으로 페이지가 작동하기 때문에 게임을 다시 실행해도 초기 상태로 돌아갈 수 없다. (정적인 페이지면 변수가 바뀌었을 수도 있다)
그래서 콘솔 창에서 수정을 해야한다.
소스를 입력하고 다시 게임을 시작하면 바로 게임에 성공했다고 뜨고, 플래그값을 얻을 수 있다.
+) 피드백
난독화는 Javascript가 아니더라도 CTF에서 간혹 쓰이는 기법이다.
난독화는 Beautify라는 툴을 이용하면 해독할 수 있다.
난독화가 되어 있다는 힌트 : 처음에 eval(function(p, a, c, k, e, d) 이다.
CTF에서 난독화 기법이 의심되는 문제가 나오면, [언어이름] Beautifier을 치면 관련된 툴을 더 쉽게 찾을 수 있다.