반응형
Javascript - Obfuscation 3
Hint: fake exist!
javascript code:
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Entrez le mot de passe / Enter password');
alert( dechiffre(h) );
dechiffre 함수를 아무리 해석하고 input값을 대입한다고 해도 인증을 성공하시진 못하셨을 겁니다.
왜냐하면 해당 함수를 아무리 풀어도 답이 아니기 때문입니다.
제 기억이 맞다면 해당 함수에서 return되는 pass 의 값에는 tab2의 값만 들어갑니다. tab2는 사용자의 input값이 아닌 function안에서 정해진
값이 들어갑니다. 따라서 사용자의 input은 해당 function에서아무런 영향을 끼치지 않습니다.
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
남은건 위의 코드 뿐입니다. 16진수로 된 값들을 가지고 String.fromCharCode()함수를 실행시켜 줍니다.
javascript에서는 객체의 프로퍼티에 접근할 때 배열인것 처럼 String["fromCharCode"]이렇게 사용하기도 합니다.
var a = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
16진수를 10진수로 바꾸는 함수는 a.toString(10) 입니다. 하지만 a의 내용을 보면 자동으로 10진수로 변환 돼있습니다.
var a =[55,56,54,79,115,69,114,116,107,49,50];
var b ="";
for(var i =0;i<a.length;i++){
b+=String.fromCharCode(a[i])
}
다음과 같이 입력하면 최종 값을 알 수 있습니다.