본문 바로가기

웹/webhacking.kr

webhacking.kr 12번

이런 코드가 존재하는데 저번에 풀었던 문제처럼 난독화가 되어 있는 것 같았습니다. 여기서 어떻게 푸는지 도저히 모르겠어서 찾아보니 마지막 부분의 ('_') 을 없앤 뒤 console창에 넣어주면 아래의 코드가 나옵니다.

(function anonymous(
) {
var enco='';
var enco2=126;
var enco3=33;
var ck=document.URL.substr(document.URL.indexOf('='));
for(i=1;i<122;i++){
  enco=enco+String.fromCharCode(i,0);
}
function enco_(x){
  return enco.charCodeAt(x);
}
if(ck=="="+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))
+String.fromCharCode(enco_(232))+String.fromCharCode(enco_(192))
+String.fromCharCode(enco_(226))+String.fromCharCode(enco_(200))
+String.fromCharCode(enco_(204))+String.fromCharCode(enco_(222-2))
+String.fromCharCode(enco_(198))+"~~~~~~"+String.fromCharCode(enco2)
+String.fromCharCode(enco3))
{
  location.href="./"+ck.replace("=","")+".php";
}
})

이제 이 코드를 분석하면 문제를 풀 수 있을 것 같습니다. 여기서 charCodeAt과 fromCharCode의 기능을 찾아보야합니다. 일단 enco_ 함수를 보겠습니다. 이 함수에서 하는 동작은 enco.charCodeAt(x)라는 값을 반환합니다. 이때 enco.charCodeAt은 enco에서 인자로 받은 인덱스의 자리에 해당하는 문자를 아스키 번호로 반환해줍니다. 해당 문제의 번호는 아래의 사이트의 표를 참고하면 됩니다.

blog.naver.com/PostView.nhn?blogId=diceworld&logNo=220175224345

 

자바스크립트 아스키코드 변환하기 (charCodeAt / fromCharCode)

- charCodeAt / fromCharCode 란? charCodeAt 은 문자열중 하나를 선택하여 아스키코드 번호로 변환...

blog.naver.com

이렇게 반환받은 번호들을 문자열로 바꿔주는 함수가 fromCharCode 입니다. 이 함수에 대한 설명도 위의 링크에도 있지만 아래의 링크도 참고했기 때문에 남깁니다.

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode

 

String.fromCharCode() - JavaScript | MDN

String.fromCharCode() 메서드는 UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환합니다. The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project,

developer.mozilla.org

위 두 함수의 기능을 이해하고 소스코드를 다시 분석해 보겠습니다.

for(i=1;i<122;i++){
  enco=enco+String.fromCharCode(i,0);
}

이 부분에서는 enco부분의 초기 상태를 만들어주는 반복문입니다. 1~122에 해당하는 문자들을 쭉 일렬로 만들어주는 과정입니다. 모든 문자를 가져와서 사용할 수 있게 하기 위해서 이렇게 해주는 것 같습니다. 이 부분을 console 창에 넣어보면

 

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy

 

이런 식의 문자열이 반환되는 것으로 보아 예상이 맞는 것 같습니다.

 

function enco_(x){
  return enco.charCodeAt(x);
}

if(ck=="="+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))
+String.fromCharCode(enco_(232))+String.fromCharCode(enco_(192))
+String.fromCharCode(enco_(226))+String.fromCharCode(enco_(200))
+String.fromCharCode(enco_(204))+String.fromCharCode(enco_(222-2))
+String.fromCharCode(enco_(198))+"~~~~~~"+String.fromCharCode(enco2)
+String.fromCharCode(enco3))

 

그리고 봐야할 부분이 이 if문의 조건 같습니다. 여기서 보면 240,220등 해당하는 인덱스의 문자를 enco에서 가져와서 문자열로 이어붙이는 것 같습니다. 이 부분을 해설할때도 크롬의 개발자 도구 기능인 console을 이용해서 해석할 수 있는데, 

5번에서 사용했던 것처럼 미리 변수에 해당하는 것을 console넣고 우리가 해석을 원하는 부분을 아래에 넣어주면 난독화되어 있는 것을 해독해주게 됩니다. 그렇게 나온 값은 'youaregood~~~~~~~!'인데 앞부분에 =가 빠졌기 때문에 이 부분을 포함한 ck값이 '=youaregood~~~~~~~!'을 만족한다면 해당 페이지로 넘어가서 문제가 해결되는 구조인 것 같습니다. 그 이유는 처음 변수 부분에서 URL에서 값을 가져오는 부분이라고 생각했기 때문입니다. 그래서 아래처럼 url을 입력하게 되면

 

문제가 풀리게 됩니다.

* 참고로 if문을 보면 =를 없애고, 앞뒤에 ./, .php를 붙여서 youaregod~~~~~~~!.php로 이동하게 만들어줘서 이 페이지로 이동하게 되면 문제가 해결되는 것 같습니다.

' > webhacking.kr' 카테고리의 다른 글

webhacking.kr 16번  (0) 2021.02.06
webhacking.kr 14번  (0) 2021.02.06
webhacking.kr 11번  (0) 2021.02.01
webhacking.kr 8번  (0) 2021.02.01
webhacking.kr 6번  (0) 2021.01.31