소스를 보면 다음과 같이 적혀있다.
<html> <head> <title>Challenge 12</title> <style type="text/css"> body { background: black; color:white; font-size:10pt; } </style> </head> <body> <script> WorkTimeFun=String.fromCharCode(118,97,114,32,101,110,99,111,61,39,39,59,13,10,118,97,114,32,101,110,99,111,50,61,49,50,54,59,13,10,118,97,114,32,101,110,99,111,51,61,51,51,59,13,10,118,97,114,32,99,107,61,100,111,99,117,109,101,110,116,46,85,82,76,46,115,117,98,115,116,114,40,100,111,99,117,109,101,110,116,46,85,82,76,46,105,110,100,101,120,79,102,40,39,61,39,41,41,59,13,10,32,13,10,32,13,10,102,111,114,40,105,61,49,59,105,60,49,50,50,59,105,43,43,41,13,10,123,13,10,101,110,99,111,61,101,110,99,111,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,105,44,48,41,59,13,10,125,13,10,32,13,10,102,117,110,99,116,105,111,110,32,101,110,99,111,95,40,120,41,13,10,123,13,10,114,101,116,117,114,110,32,101,110,99,111,46,99,104,97,114,67,111,100,101,65,116,40,120,41,59,13,10,125,13,10,32,13,10,105,102,40,99,107,61,61,34,61,34,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,52,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,51,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,49,57,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,54,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,48,48,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,48,52,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,50,50,50,45,50,41,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,95,40,49,57,56,41,41,43,34,126,126,126,126,126,126,34,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,50,41,43,83,116,114,105,110,103,46,102,114,111,109,67,104,97,114,67,111,100,101,40,101,110,99,111,51,41,41,13,10,123,13,10,97,108,101,114,116,40,34,80,97,115,115,119,111,114,100,32,105,115,32,34,43,99,107,46,114,101,112,108,97,99,101,40,34,61,34,44,34,34,41,41,59,13,10,125,13,10); eval(WorkTimeFun); </script> <font size=2>javascript challenge</font> </body> </html>
필터링을 피해 XSS를 걸때 주로 사용되는 방법으로, fromCharCode를 하면 저녀석들을 브라우저가 알아서 해석해 돌리게 된다.
옛날엔 어떻게 해독을 했을지 모르겠는데 요새는 브라우저가 너무 좋아졌다.
String.fromCharCode부터 쭉 복사해서 개발자도구를 열고 콘솔에 엔터 한번 쳐준다.
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)) { alert("Password is "+ck.replace("=","")); }
원래의 코드가 등장했다.
약한 느낌으로 난독화 되어 있기때문에 얘도 읽는 성의를 들여야한다. 그치만 우린 귀찮으니까 브라우저의 똑똑함에 맡겨가며 읽어보자.
for(i=1... 이 구문은 척 봐도 CharCode대로 enco에 다 넣어주는 코드다.
일일히 돌려보기 귀찮은 사람은 그냥 alert(enco); 하면 다 나온다.
여튼 얻은 값은 다음과 같다. 깨진 문자열이 있어서 복사는 제대로 안된다. (아스키코드에 기반하므로)
function은 넘어가고, 아주 길어보이는 if문을 보자. 아주 길어보이지만 사실 별거 없다.
보자고 했지만 얘네를 또 모조리 다 읽어야할까? 역시 당연히 아니다. 원리는 enco_ 라는 함수로 한번더 꼬은것뿐, String.fromCharCode와 결국 원리는 거의 같다.
이녀석을 읽는데 시간투자하지 말고, 그냥 복사해서 console.log로 찍어보자. 정답이 나온다. Auth 해주면 풀이 완료.