simple_js-wp

题目:

图片[1]-simple_js-wp-Drton1博客

打开一个弹窗, 然后让输入东西, 随便输入后 显示:

图片[2]-simple_js-wp-Drton1博客

F12找到JS源码:

图片[3]-simple_js-wp-Drton1博客

开始分析:

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('Enter password');
alert( dechiffre(h) );

开始对dechiffre函数进行分析:

前三行:

 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;

第一行定义了一个数据pass 里面放了一些数字 但是要注意 此时pass 是一个字符串

第二行tab用”,” 把pass里面的数字都分割了 变成一个数组 ,此时tab是一个字符串数组。

第三行tab2同理。

第四行定义了一些变量 i=0 j=18(tab元素个数) l=0 m,n,o,p未定义。

前三行看完了 看下两行

k = j + (l) + (n=0); //k=18+0+0
n = tab2.length; //n=18

这里的(l)就是上面定义的变量 l;

再看第一个循环:

 for(i = (o=0); i < (k = j = n); i++ )
{
o = tab[i-l];
p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;
}

i=0 k=j=n 都是18 所以 i<18 i++

简化一下就是

 for(i = 0; i <18; i++ )
{
o = tab[i-l];
p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;
}

可以看到i=5时 循环就会结束 所以这个循环就是 i从0到5 循环了6次。

可以看到一个有意思的点:

o = tab[i-l];

o = tab2[i];

所以再对o 进行操作时候 o=tab[i-1] 已经被o=tab2[i] 给覆盖了。

再简化一下程序:

 for(i = 0; i <6; i++ )
{
    p += String.fromCharCode((o = tab2[i]));
    
}

再看看String.fromCharCode的用法:

图片[4]-simple_js-wp-Drton1博客

那就很简单了 这个循环 总共用到了数组的前6个 分别为:

70,65,85,88,32,80 对应的字符就是 FAUX P

图片[5]-simple_js-wp-Drton1博客

至此第一个循环结束了。

再看第二个循环:

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]));
 }

这个思路跟第一个一样 我们整理一下代码 简化为:

for(i = 6; i < 18; i++ )
{
  p += String.fromCharCode((o = tab2[i]));
 }

那就是后12union编码呗:

65,83,83,87,79,82,68,32,72,65,72,65—>ASSWORD HAHA

Untitled

把这两次循环 得到的字符给拼接起来就是

: FAUX PASSWORD HAHA

p += String.fromCharCode(tab2[17]);
pass = p;
return pass;

这个函数最后两句 还是把 这个字符串给返回了

那我们传进来的参数呢? 看前面分析知道 我们传进来的参数实在tab数组里

可是全程用的都是tab2 没有用过tab 所以不管我们传什么进来,他都会返回这个字符串,然后弹窗。- –

再看代码发现:

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"));

有这一句 之前写一个反序列化 见过八进制绕过那个字符格式跟这个

“\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”

差不多 ,于是用php输出一下:

图片[7]-simple_js-wp-Drton1博客

是一串数字:

String["fromCharCode"](dechiffre())

再看这个 猜测这个数字 也要union编码 转成字符可能就是flag:

55,56,54,79,115,69,114,116,107,49,50—>786OsErtk12

图片[8]-simple_js-wp-Drton1博客

根据题目提示 把这串文字填充进去 就是flag 成功。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论