攻防世界web新手之simple_js

攻防世界web新手之simple_js

打开题目地址,查看源码,发现head里藏了一段js代码,于是考下来研究研究

function dechiffre(pass_enc)
	{
        var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";  //0-17
        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('Enter password');
    alert( dechiffre(h) );

代码的功能很简单,就是把一串用逗号分隔的数字按ascii转成字符串,然后输出

总之我在读代码时是一脸懵逼的,首先声明了好几个没有使用的变量,其次那两个for循环根本就没必要,一个for就够了,最重要的是,输入的内容并没有被处理,也就是说输出和我们的输入没有关系

所以我们需要对代码进行修改,将for循环内的

p += String.fromCharCode((o = tab2[i]));

改成

p += String.fromCharCode((o = tab[i]));

这样就能处理输入的内容
然后发现在代码尾部有这样一段

"\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"

是十六进制的ascii码,把它放到python里面转成字符
攻防世界web新手之simple_js_第1张图片
是一段用逗号分隔的数字,很明显是需要输入到是上面的dechiffre()函数里面转码成字符

把之前修改好的js代码插入到HTML中







使用浏览器打开HTML文件,输入得到的数字攻防世界web新手之simple_js_第2张图片
就可得到flag

感觉这道题的关键是读代码,看懂代码就没什么了。

你可能感兴趣的:(ctf总结)