들어가면 'javascript challenge'라고 두 단어적혀있다. 굳이 스크린샷 뜨는게 낭비인것 같다.
소스를 보면 다음과 같이 적혀있다.
<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 해주면 풀이 완료.
늘모
2016/03/28 22:04
2016/03/28 22:04