不难不易的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=10n=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 encryptionif (!('ENCRYPT' == method || 'DECRYPT' == method)) {method = 'ENCRYPT';}// Run algorithm with the right methodif ('ENCRYPT' == method) {// Variable for output stringvar output = '';// Algorithm to encryptfor (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 outputreturn output;} else if ('DECRYPT' == method) {// DECODE MISS// Return ASCII value of characterreturn 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-068wctf{MS14-068}我也是醉了。。。

IDF-CTF-天罗地网相关推荐

  1. IDF - CTF - 牛刀小试

    发现一个学CTF的好地方,IDF实验室的CTF训练营(http://ctf.idf.cn/).. 刚接触CTF,来玩下牛刀小试,AK了..好爽好爽.. 1.摩斯密码 嘀嗒嘀嗒嘀嗒嘀嗒 时针它不停在转动 ...

  2. CTF writeup 0_IDF实验室

    牛刀小试 1.被改错的密码 从前有一个熊孩子入侵了一个网站的数据库,找到了管理员密码,手一抖在数据库中修改了一下,现在的密码变成了 cca9cc444e64c8116a30la00559c042b4, ...

  3. CTF dotNet逆向分析

    题目来源http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=36 .NET逆向第一题  嗯,看名字就应该明白了,快去 ...

  4. idf实验室--简单编程字符统计

    idf实验室--简单编程字符统计,有需要的朋友可以参考下. 第一眼看这道题很简单,不就是字符统计么,可是题目要求2s内回答,而且每次打开的页面需要统计的字符串内容都会变,这就蛋疼了,于是乎上网学习下如 ...

  5. 转载的ctf练习链接

    正文如下: Author:4ido10n Home:http://www.secbox.cn/author/4ido10n 学习的地方很多,不能一一列举,一些优秀的网址和博客可能也没有提到,大家补充吧 ...

  6. CTF入门指南(0基础)

    ctf入门指南 如何入门?如何组队? capture the flag 夺旗比赛 类型: Web 密码学 pwn 程序的逻辑分析,漏洞利用windows.linux.小型机等 misc 杂项,隐写,数 ...

  7. 网安、ctf常用网址

    [转载备用] 原文地址  http://blog.csdn.net/ida0918/article/details/52730662 http://www.sec-wiki.com/skill/ 安全 ...

  8. 个人总结-网络安全学习和CTF必不可少的一些网站

    学习的地方很多,不能一一列举,一些优秀的网址和博客可能也没有提到,大家补充吧:P 就简单总结一些常用的吧,本人是十足的彩笔,还望大家多多指点,表哥们带我飞Orz http://www.sec-wiki ...

  9. CTF网络安全大赛介绍

    赛事介绍 CTF竞赛模式分为以下三类: 一.解题模式(Jeopardy)在解题模式CTF赛制中,参赛队伍可以通过互联网或者现场网络参与,这种模式的CTF竞赛与ACM编程竞赛.信息学奥赛比较类似,以解决 ...

  10. CTF常见加密方式汇总

    1.栅栏密码 在IDF训练营里做过一道关于栅栏密码的问题. 栅栏密码的解法很简单,也有点复杂,字符长度因数多得会有很多个密码.对,栅栏密码的解法就是:计算该字符串是否为合数,若为合数,则求出该合数除本 ...

最新文章

  1. PV-RAFT:用于点云场景流估计的点体素相关场(CVPR2021)
  2. Java 理论与实践: 正确使用 Volatile 变量
  3. java.lang.date_无法将java.lang.String类型的值转换为必需类型java.util.Date
  4. 转载---sharepoint相关资源
  5. 最短路和次短路问题,dijkstra算法
  6. 微信小程序笔记六模块化 —— module.exports
  7. 实战案例:探索星巴克的世界分布
  8. rnqoj-28-合唱队形-最长上升子序列
  9. Atitit 软件设计中的各种图纸 uml 之道 1. 常见设计成果与图纸 1 1.1. ui原型图与html 1 1.2. 业务逻辑 伪代码 各种uml图 1 1.3. 业务逻辑 流程图 ns
  10. Atitit 如何利用先有索引项进行查询性能优化
  11. 输入的字与系统编码不符_伺服系统故障排除法
  12. Android自动化批量图片压缩插件McImage
  13. 全球与中国具有集成保护功能的共模滤波器(CMF)市场深度研究分析报告
  14. 关于知识分享和微软TechEd Roadshow
  15. 大一上学期C++课程设计——学生成绩管理系统(QT项目)
  16. fdisk和parted对磁盘的分区总结
  17. 【华为机试真题 Python】跳格子游戏
  18. janusgraph源码分析1-下载编译启动 1
  19. gb酱油和gbt酱油哪个好_酱油那个gb18186是纯酿造的吗
  20. NextCloud安装及配置(docker-compose)

热门文章

  1. Python 常用编程方法
  2. 迷宫问题(搜索+回溯)
  3. 乌鲁木齐PHP现状,2020年奋进中的乌鲁木齐:多的是你不知道的事
  4. android 联系人 --- 读取usim卡的邮箱
  5. 与“色情”割席,陌生人社交如何重塑品牌形象?
  6. CTF—ssh私钥泄露
  7. 一个软件图标大全的网站
  8. bfv同态加密_同态加密综述
  9. 数据安全前沿技术同态加密
  10. unity3d游戏场景制作