IDF-CTF-天罗地网

不难不易的js加密

题目:就是这里 → http://ctf.idf.cn/game/web/28

点击链接,弹出一个输入框。要求输入flag。

这里写图片描述

查看源代码,发现一个script脚本。
然后复制到站长工具js混淆加密压缩那里解密。
http://tool.chinaz.com/js.aspx

得到解密后的代码:

var a = prompt("\u8f93\u5165\u4f60\u7684\x66\x6c\x61\x67\u5427\uff0c\u5c11\u5e74\uff01", "");
var b = "\x66\x33\x33\x37\x33\x65\x33\x36\x63\x36\x37\x37\x37\x35\x30\x37\x37\x39\x66\x35\x64\x30\x34\x66\x66\x37\x38\x38\x35\x62\x33\x65";
var c = /.+_.+_.+/gi;
var d = 0x0;
var e = a.substr(0x8, 0x5);
if ($.md5(e) == b.replace(/7/ig, ++d).replace(/8/ig, d * 0x2)) {
    var f = a.substr(0x0 / d, 0x7);
    if (f.substr(0x5, 0x2) == "\x6a\x73" && $.md5(f.substr(0x0 / d, d + 0x3)) == "\x64\x30\x31\x35\x34\x64\x35\x30\x34\x38\x62\x35\x61\x35\x65\x62\x31\x30\x65\x66\x31\x36\x34\x36\x34\x30\x30\x37\x31\x39\x66\x31") {
        r = a.substr(0xd);
        if (r.charCodeAt(d) - 0x19 == r.charCodeAt(++d) - 0x19 && r.charCodeAt(--d) - 0x19 == r.charCodeAt(--d)) {
            var g = String.fromCharCode(0x4f);
            g = g.toLowerCase() + g.toLowerCase();
            if (r.substr((++d) * 0x3, 0x6) == g.concat("\x65\x61\x73\x79") && c.test(a)) {
                d = String(0x1) + String(a.length)
            }
        }
    }
};
if (a.substr(0x4, 0x1) != String.fromCharCode(d) || a.substr(0x4, 0x1) == "\x7a") {
    alert("\u989d\uff0c\u518d\u53bb\u60f3\u60f3\u3002\u3002")
} else {
    alert("\u606d\u559c\u606d\u559c\uff01")
}

将代码中的unicode码和ascii码全部转换为字符,将16进制数转换为10进制数。
转换方法:直接在浏览器控制台输入即可转换。

这里写图片描述

转换后的代码如下:

var a = prompt("输入你的flag吧,少年!", "");
var b = "f3373e36c677750779f5d04ff7885b3e";
var c = /.+_.+_.+/gi;
var d = 0;
var e = a.substr(8, 5);
if ($.md5(e) == b.replace(/7/ig, ++d).replace(/8/ig, d * 2)) {
    var f = a.substr(0 / d, 7);
    if (f.substr(5, 2) == "js" && $.md5(f.substr(0 / d, d + 3)) == "d0154d5048b5a5eb10ef1646400719f1") {
        r = a.substr(13);
        if (r.charCodeAt(d) - 25 == r.charCodeAt(++d) - 25 && r.charCodeAt(--d) - 25 == r.charCodeAt(--d)) {
            var g = String.fromCharCode(79);
            g = g.toLowerCase() + g.toLowerCase();
            if (r.substr((++d) * 3, 6) == g.concat("easy") && c.test(a)) {
                d = String(1) + String(a.length)
            }
        }
    }
};
if (a.substr(4, 1) != String.fromCharCode(d) || a.substr(4, 1) == "z") {
    alert("额,再去想想。。")
} else {
    alert("恭喜恭喜!")
}
好,那么现在看起来就舒服多了,开始解密吧,一般情况下,解密都是从最后一句往前逆推,可是这里的代码不行,需要正向解密,就是从头到尾
一句一句的去分析。

在分析的过程中,为了方便观察过程,加上注释以及将一些有关算数的表达式直接计算出结果替换原来的表达式。

大概浏览一下可得知字符串a是我们要求的答案。
第一句是输入字符串变量a,接着给出b,c,d三个变量。
看到第一个if语句,判断的是e变量经过md5加密后和b变量经过正则替换后是否相等。

在控制台下输入即可看到结果:

这里写图片描述

可看到b变量替换后的结果为:f3313e36c611150119f5d04ff1225b3e
此时d=1
去cmd5网站解密得到:jiami
那么现在就得知,e = a.substr(8, 5)=“jiami”
字符串a从第八位开始的五位是"jiami"

做好注释:

var e = a.substr(0x8, 0x5);  //e="jiami"
if ($.md5(e) == b.replace(/7/ig, ++d).replace(/8/ig, d * 0x2)) {  //f3313e36c611150119f5d04ff1225b3e="jiami"
接着,var f = a.substr(0 / d, 7);
因为d=1,所以这里是var f = a.substr(0, 7);
由此可知 f 的长度为7

看第二个if语句:

if (f.substr(5, 2) == "js" && $.md5(f.substr(0 / d, d + 3)) == "d0154d5048b5a5eb10ef1646400719f1") 

等价于

if (f.substr(5, 2) == "js" && $.md5(f.substr(0,4)) == "d0154d5048b5a5eb10ef1646400719f1") 
到cmd5解密可得d0154d5048b5a5eb10ef1646400719f1=“wctf”

由此可知 f = "wctf?js" , 其中?为未知字符,不过做了这么多题,这个问号很明显就是"{",因为idf的题目的答案都是
"wctf{........}"这样的格式的。

那么现在就得知 a 从第0位到第12位为"wctf?js?jiami"。
r = a.substr(13);

r 是 a 从第13位开始到最后1位的字符串。

接着是第三个if语句:

if (r.charCodeAt(d) - 25 == r.charCodeAt(++d) - 25 && r.charCodeAt(--d) - 25 == r.charCodeAt(--d)) 

等价于

if (r.charCodeAt(1) - 25 == r.charCodeAt(2) - 25 && r.charCodeAt(1) - 25 == r.charCodeAt(0)) 
由此可知,r 的第0位的ascii码(10进制)比第1位的ascii码小25,第1位和第2位是相同的字符。
var g = String.fromCharCode(79);g = g.toLowerCase() + g.toLowerCase();

在控制台下运行的结果:

这里写图片描述

那么这两句就等价于:

var g="oo";

接着是第4个if语句:

if (r.substr(3,6) == g.concat("easy") && c.test(a))
可知g.concat("easy")="ooeasy",r 从第3为开始的6个字符是"ooeasy"
此时我们得知 r = “???ooeasy.........”(后面有若干位未知)

那么现在我们得知 a = "wctf?js?jiami???ooeasy........."(后面的若干位未知)

test() 方法用于检测一个字符串是否匹配某个模式。
从c.test(a)可知,a 的格式必为"??_??_??"
d= String(0x1) + String(a.length)
这时我们并不知道 a 的长度,所以无法知道 d 的值。
继续往下看。

第5个if语句:

if (a.substr(4,1) != String.fromCharCode(d) || a.substr(4,1) == "z")
由此得知 a 的第4位不是"z",而且 d 代表的字符。

好了,现在我们看看掌握的信息。

现在解得的 a 为"wctf?js?jiami???oosasy................."(后面还有若干位未知)

前面提到过idf题目的答案都是固定格式的,"wctf{..........}",那么我们就猜测 a 的第4位是"{",查看"{"的ascii码为 123,那么
我们假设d=“123”


由 d= String(0x1) + String(a.length)得知,a.length=23

那么我们数一数"wctf{js?jiami???ooeasy........"中确定的共有多少位,数了一下从w开始到y结束共有22位

可以确定 a =“wctf{js?jiami???ooeasy?”

根据格式我们猜测最后一位是"}"

那么 a = “wctf{js?jiami???ooeasy}”

由前面的test方法可知 a 的格式为??_??_?? ,那么我们继续猜测 a = "wctf{js_jiami_??ooeasy}"

前面已知, r 的第0位的ascii码比第1位小25,第1位和第2位是相同的字符此时,r 的第0位为"_",查看其ascii码是95,那么第1位
的ascii码是95+25=120,字符是“x”

到这里,a 的值我们已经全部猜解完了,a = “wctf{js_jiami_xxooeasy}”

经过注释之后的代码:

var a = prompt("输入你的flag吧,少年!", "");
var b = "f3373e36c677750779f5d04ff7885b3e";
var c = /.+_.+_.+/gi;
var d = 0;
var e = a.substr(8, 5);  //e="jiami"

if ($.md5(e) == b.replace(/7/ig, ++d).replace(/8/ig, d * 2)) {  //f3313e36c611150119f5d04ff1225b3e="jiami"
    var f = a.substr(0,7); //f="wctf*js"
    if (f.substr(5,2) == "js" && $.md5(f.substr(0,4)) == "d0154d5048b5a5eb10ef1646400719f1") {
        r = a.substr(13);   //len(r)=23-13=10
        n=r.charCodeAt(1) - 25;
        if (r.charCodeAt(1) - 25 == r.charCodeAt(2) - 25 && r.charCodeAt(1) - 25 == r.charCodeAt(0)) {
            var g="oo";    //r="_xxooeasy}"
            if (r.substr(3,6) == g.concat("easy") && c.test(a)) {
                d = String(1) + String(a.length)   //d="123"   a.length=23
            }
        }
    }
};
if (a.substr(4,1) != String.fromCharCode(d) || a.substr(4,1) == "z") {
    alert("额,再去想想。。")
} else {
    alert("恭喜恭喜!")
}               //a="wctf{js_jiami_xxooeasy}";

现在看看我们猜得对不对吧。

这里写图片描述

这里写图片描述

结果正确。

收获:解密并不都是从尾到头逆推,还可以是从头到尾的正向解密。在本题中是正向和逆向的结合分析,锻炼了分析的能力。

COOKIE欺骗

题目:
这里这里→ http://ctf.idf.cn/game/web/40/index.php

点击链接,页面出现了一段很长的字符串。。。

根据题意,cookie欺骗,那肯定是要修改请求包的cookie来获取答案的,那么先打开burpsuite抓包看看

请求包的字段如下:

这里写图片描述

没有发现很明显的字眼。。。

但是发现了在url中有两个参数,line和file

其中file参数的值看起来好像是base64编码。。。

去解码看看,解出来是flag.txt

那么这个嘛,是文件包含,是不是有文件包含漏洞呢。。。

将flag.php转base64编码,提交,页面返回空白,不行。。。

放到line参数后面,还是不行。。。

经过若干次尝试后。。。

好吧,主页叫什么来着,index.php是吧,那提交它看看。。。还是空白。。。

line,line,line,line是行的意思,那就是数字咯,加个1看看

line=1&file=aW5kZXgucGhw

还真返回一些东西了。。。返回的是一句话。。。

那接着改line参数,改为2,3。。。

果然,每次都返回一句话,组合起来好像是后代代码。。。

好吧,那就上python写个脚本,把它的代码跑出来吧。

import urllib2
for i in range(0,19):
    url = "http://ctf.idf.cn/game/web/40/index.php?line="+str(i)+"&file=aW5kZXgucGhw"
    req = urllib2.urlopen(url)
    html = req.read()
print html

返回的是一段php代码

这里写图片描述

仔细阅读这段代码后,得知当在请求的cookie中添加key字段,值为idf时,会生成一个flag.php文件,哼哼。。。

上burpsuite修改,发包,看返回结果。

这里写图片描述

添加了key字段,值为idf

查看返回结果

这里写图片描述

答案就是wctf{idf_c00kie}

一种编码而已

题目:

这里写图片描述

这是啥???没见过?!
好吧,百度一下你就知道,这是一种javascript的一种表达方法。
复制到控制台运行,看看是什么。

这里写图片描述

直接就是答案了。。。
WCTF{H3110_J0t4er}

简单的js解密

题目:这里这里→ http://ctf.idf.cn/game/web/43/index.php

这里写图片描述

查看源代码,找到关键代码。

function pseudoHash(string, method) {
  // Default method is encryption
  if (!('ENCRYPT' == method || 'DECRYPT' == method)) {
    method = 'ENCRYPT';
  }
  // Run algorithm with the right method
  if ('ENCRYPT' == method) {
    // Variable for output string
    var output = '';
    // Algorithm to encrypt
    for (var x = 0, y = string.length, charCode, hexCode; x < y; ++x) {
      charCode = string.charCodeAt(x);//字符转ascii码(10进制)
      if (128 > charCode) {
        charCode += 128;
      } else if (127 < charCode) {
        charCode -= 128;
      }
      charCode = 255 - charCode;
      hexCode = charCode.toString(16);//10进制转16进制
      if (2 > hexCode.length) {
        hexCode = '0' + hexCode;
      }

      output += hexCode;
    }
    // Return output
    return output;
  } else if ('DECRYPT' == method) {
    // DECODE MISS
    // Return ASCII value of character
    return string;
  }
}
document.getElementById('password').value = pseudoHash('4a4d491c4c4d4e4a4c471b464a4e191a471b4d1d461e1d194a4b1b1d1b1d464e', 'DECRYPT');

函数中有加密的部分,但是缺少解密的部分,需要我们补全。

分析加密的步骤:
1. 遍历字符串,获取每个字符串的ascii码(十进制),保存到charCode中
2. 如果charCode小于128,则加上128;如果大于127,则减去128
3. charCode = 255 - charCode
4. 将charCode转换为16进制
5. 连接字符串

那么解密就是将上述过程反过来就可以了。

  1. 遍历字符串,每次获取两个字符,保存到charCode中
  2. 将charCode转换为10进制
  3. charCode = 255 - charCode
  4. 如果ascii大于等于128,则减去128;如果小于等于127,则加上128
  5. 将charCode转换为字符,并连接为字符串

补全的代码如下:

else if ('DECRYPT' == method) {

    var output='';
    for(var x=0,chr;x<string.length;x+=2){
        charCode = string.substr(x,2); //每次获取两个字符
        charCode = parseInt(charCode,16); //16进制转换为10进制
        charCode = 255 - charCode;
        if(128 <= charCode){
            charCode-=128;
        }
        else if (127 >= charCode){
            charCode+=128;
        }
        chr = String.fromCharCode(charCode);//ascii转字符
        output += chr;
    }
    return output;
  }

在函数的最后可以找到要解密的字符串
4a4d491c4c4d4e4a4c471b464a4e191a471b4d1d461e1d194a4b1b1d1b1d464e

解密得到结果:
526c321538d951fe8d2b9abf54dbdb91

这个结果看着像md5加密过的,我就拿去cmd5解密,得到4374

然后我就去提交:4374,不对。。。
提交wctf{4374},不对。。。
那直接提交:526c321538d951fe8d2b9abf54dbdb91,不对。。。
提交wctf{526c321538d951fe8d2b9abf54dbdb91},还是不对。。。
那在页面上输入526c321538d951fe8d2b9abf54dbdb91,点击”走你”按钮,没有反应。。。

怎么回事呢?

测试一下自己写的代码,加密和解密结果是正确的。。。
再去看看网页源代码。。。{{{(>_<)}}}问题来了,发现输入框中的要解密的字符串不一样了。。。

原来我刚才把网页给关了,然后再次打开之后,字符串就变了。。。
好吧。。。

这次的字符串是:
4d4c4c194e1b1b4f194c194a4c481d1c1d481e4c4c471a1e484b1b494c4b474c

解密结果是:
233f1dd0f3f537bcb7a338ea74d63483

在输入框中输入:233f1dd0f3f537bcb7a338ea74d63483
点击“走你”按钮,得到答案
wctf{jS_decRypt__Eaaasy}

此题要注意的地方:
1. 要在问题页面输入解密的结果,点击”走你“按钮,才会有结果。
2. 关闭浏览器后重新打开该问题的页面,要解密的字符串会改变。

超简单的js题

这里写图片描述

查看源代码,找到关键代码,复制到控制台,将eval改为console.log,运行得到下图:

这里写图片描述

将cd97a9827443abcf598708413171185a输入到输入框中,点击“走你!”按钮,即可得到答案。

这里写图片描述

古老的邮件编码

这里写图片描述

这是什么鬼?!
百度一下,好吧,uuencode编码。。。(+﹏+)~那这不应该是misc的题吗。。。
找个uuencode在线解码的网站,解码得到答案。

这里写图片描述

wctf{uuuuuencode__}

你关注最新的漏洞吗

题目:
每个人都会梦想手头有一把0day,不过0day可遇不可求,我们还是关注最新的漏洞吧:http://pan.baidu.com/s/1hqf5YZE
答案格式:wctf{*}

下载了这个压缩包后解压得到一个wireshark捕获的数据包,用wireshark打开后发现有四个数据报,使用的是kerberos5协议,根
据题目的意思,就是要找kerberos5协议的漏洞了。

这里写图片描述

百度一下kerberos5漏洞,得知最近的漏洞为CVE-2014-6324,再百度一下CVE-2014-6324了解详情,然而在我看完后回来做题,发现
那些密钥,是用hmac md5加密的,可是。。。不会解啊。。。

竟然是提交漏洞的公告号。。。
公告号是MS14-068

wctf{MS14-068}

我也是醉了。。。
发布了25 篇原创文章 · 获赞 13 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/a200710716/article/details/51189690
ctf
今日推荐