[Dreamhack] funjs
Web Hacking - WARGAME (funjs)
드림핵 웹 기본 상식에서 해결해야 하는 실습 CTF 문제는 Carve Party, funjs, devtools-sources 세 개가 있었는데, Carve Party는 이전에 해결해두었던 문제라 funjs, devtools-sources 두 문제를 풀었다. 사실 devtools-sources는 사고능력을 요구한다기보다는 노가다로 flag를 찾는 문제라 정리할 이유가 없을 것 같아 funjs 문제만 포스팅 해보려 한다. Carve Party는 js 코드를 읽고 해석할 줄 안다면 쉽게 풀 수 있는 문제라 후에 코드를 찾아 포스팅하기로..
problem 1
일단 대충만 봐도 난독이 심한 코드라 열자마자 머리가 아팠다. movebox의 움직임이 굉장히 거슬렸으나 .. 직접 입력을 취해 해결하는 문제가 아님이 확실하므로 굳이 움직임을 제하지는 않았으며, main부의 함수들을 중점적으로 봤다.
solution
1) 코드를 모두 읽고 해석하기에는 무리가 있어서 ctrl+f를 사용하여 flag 가 포함된 코드만을 찾았다. 그 결과 아래 두 블록이 flag를 만들고, 출력을 정하는데 사용된다는 것을 알 수 있었다
var flag = document[_0x374fd6(0x183)](_0x374fd6(0x182))['value']
for (var i = 0x0; i < flag[_0x374fd6(0x17c)]; i++) {
if (flag[_0x374fd6(0x176)](i) == operator[i % operator[_0x374fd6(0x17c)]](_0x4949[i], _0x42931[i])) {}
else {
text2img(_0x374fd6(0x185));
return;
}
}
2) 따라서, 코드의 변수 선언부를 모두 콘솔에 입력한 후, console.log를 통해 외계어같은 변수들이 무엇을 의미하는 지 아래와 같이 찾아보았다
3) 이를 통해 찾은 정보를 코드에 대입해보면,
var flag = document.getElementById('flag')['value']
for (var i = 0x0; i < flag.length; i++) {
if (flag.charCodeAt(i) == operator[i % operator.length](_0x4949[i], _0x42931[i])) {}
else {
text2img('NOP !');
return;
}
}
4) 위와 같은 두 코드를 얻을 수 있다. 이 때 전체 코드의 하단부에 value = ‘‘으로 설정되어, flag의 초기 값을 빈 문자열로 선언한 후, 위의 코드들을 바탕으로 flag를 출력할 수 있도록 아래와 같이 코드를 작성하였다. 이 때, 반복의 범위에 해당하는 flag.length는 알 방법을 찾지 못하여 임의의 값들을 대입하다, 100을 넣었을 때 깔끔한 정보가 나오기에 100으로 코드를 작성한 후 답에 붙여넣었다. 다른 값을 범위로 넣어주어도, flag가 반복되어 출력될 뿐 얻는 데에는 문제가 발생하지 않는다.
+) flag.charCodeAt(i) == operator [i % operator.length] (_0x4949[i], _0x42931[i])인 경우에만 NOP ! 이 출력되지 않고 진행되므로, flag에 operator [i % operator.length] (_0x4949[i], _0x42931[i]) 값을 더해주며 충분한 반복을 진행한다면 언젠가 프로그램이 알아서 flag를 출력할 것이라고 생각했다