webhacking.kr Challenge 12
들어가보면 javascript challenge 라고만 써있고 별다른 내용이 없어 페이지소스를 확인했다.
String.FromCharCode(n1, n2....)는 n1을 아스키코드로 변환해 문자열을 반환해준다. 아무 인수도 없을 경우엔 빈 문자열을 반환한다.
eval(string)은 string을 자바스크립트로 실행시켜주는 함수다.
그렇다면 위 코드는 WorkTimeFun이라는 문자열을 실행하는 코드이고 WorkTimeFun이 어떤 문자열인지 알면 해결할 수 있다.
먼저 WorkTimeFun 이라는 문자열을 알아내기 위해서는 숫자를 아스키코드에 대입해 문자열로 바꿔야 하는데 이는 javascript editor를 사용했다.
(https://js.do/)
WorkTimeFun은 다음과 같다.
var enco='';
var enco2=126;
var enco3=33;
var ck=document.URL.substr(document.URL.indexOf('=')); //'='가 있는 곳 까지 현재 url을 ck 라는 변수에 넣음
for(i=1;i<122;i++) {
enco=enco+String.fromCharCode(i,0);
} //enco 라는 변수에는 1,0부터 121,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("=",""));
} //ck가 특정 문자열과 같으면 Password를 알려줌. Password는 ck의 =를 뺀 부분임.
ck가 같아야 하는 문자열을 분석해보면 enco문자열을 알아야한다. enco는 시작 인덱스를 0으로 짝수의 인덱스에는 순차적으로 1부터 121까지 아스키코드값으로 넣어져 있고, 홀수 인덱스에는 항상 0의 값이 아스키코드로 넣져있는 문자열이다.
charCodeAt(n)은 n에 해당하는 문자열의 인덱스 값을 아스키 코드 값으로 반환해준다.
fromCharCode(n)은 n에 해당하는 아스키코드를 문자열로 반환해준다.
예를 들어 가장 앞에 있는 String.fromCharCode(enco_(240))을 보면, 먼저 encno_(240)은 enco의 인덱스 240을 아스키코드 숫자로 반환한다. 그 값은 121이다. (for 문에서 i 의 값) 그 후 String.fromCharCode(121)은 121에 해당하는 문자를 반환하므로 'y'가 된다.
이런식으로 하나씩 풀어가다보면 결국
youaregod~~~~~~~!
이라는 문자열이 완성된다. 이를 auth에 넣어주면
성공!
참고:
https://msdn.microsoft.com/ko-kr/library/wb4w0k66(v=vs.94).aspx
https://www.cmsfactory.net/node/10422
https://opentutorials.org/course/50/87
들어가보면 javascript challenge 라고만 써있고 별다른 내용이 없어 페이지소스를 확인했다.
String.FromCharCode(n1, n2....)는 n1을 아스키코드로 변환해 문자열을 반환해준다. 아무 인수도 없을 경우엔 빈 문자열을 반환한다.
eval(string)은 string을 자바스크립트로 실행시켜주는 함수다.
그렇다면 위 코드는 WorkTimeFun이라는 문자열을 실행하는 코드이고 WorkTimeFun이 어떤 문자열인지 알면 해결할 수 있다.
먼저 WorkTimeFun 이라는 문자열을 알아내기 위해서는 숫자를 아스키코드에 대입해 문자열로 바꿔야 하는데 이는 javascript editor를 사용했다.
(https://js.do/)
WorkTimeFun은 다음과 같다.
var enco='';
var enco2=126;
var enco3=33;
var ck=document.URL.substr(document.URL.indexOf('=')); //'='가 있는 곳 까지 현재 url을 ck 라는 변수에 넣음
for(i=1;i<122;i++) {
enco=enco+String.fromCharCode(i,0);
} //enco 라는 변수에는 1,0부터 121,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("=",""));
} //ck가 특정 문자열과 같으면 Password를 알려줌. Password는 ck의 =를 뺀 부분임.
ck가 같아야 하는 문자열을 분석해보면 enco문자열을 알아야한다. enco는 시작 인덱스를 0으로 짝수의 인덱스에는 순차적으로 1부터 121까지 아스키코드값으로 넣어져 있고, 홀수 인덱스에는 항상 0의 값이 아스키코드로 넣져있는 문자열이다.
charCodeAt(n)은 n에 해당하는 문자열의 인덱스 값을 아스키 코드 값으로 반환해준다.
fromCharCode(n)은 n에 해당하는 아스키코드를 문자열로 반환해준다.
예를 들어 가장 앞에 있는 String.fromCharCode(enco_(240))을 보면, 먼저 encno_(240)은 enco의 인덱스 240을 아스키코드 숫자로 반환한다. 그 값은 121이다. (for 문에서 i 의 값) 그 후 String.fromCharCode(121)은 121에 해당하는 문자를 반환하므로 'y'가 된다.
이런식으로 하나씩 풀어가다보면 결국
youaregod~~~~~~~!
이라는 문자열이 완성된다. 이를 auth에 넣어주면
성공!
참고:
https://msdn.microsoft.com/ko-kr/library/wb4w0k66(v=vs.94).aspx
https://www.cmsfactory.net/node/10422
https://opentutorials.org/course/50/87
댓글
댓글 쓰기