作者:[局外人]
分类:[技术分析]
标签:CTF SHOW
刷题
新手
阅读时长:约 [2] 分钟
引言(前言)
日常CTF 做题记录,日常做题分享,希望能积累更多的知识!!!
攻防世界 simple_js
1.1 题目及分析
<html>
<head><title>JS</title><script type="text/javascript">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) );</script>
</head></html>
- 题目分析
- 此题是很蛋的题目。
1.2 思路
- 这题主要是代码审计,但是我看代码太长了懒得看,就丢给gpt了,如下:
这段JavaScript代码定义了一个名为
dechiffre
的“解密”函数,但其实际功能存在误导性。我们可以通过逐行分析来理解它的作用:
核心分析:dechiffre
函数的实际逻辑
- 固定的“密钥”:函数内定义了一个固定字符串
pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65"
,这是一系列ASCII码的逗号分隔值,拆分后得到数组tab2
(共18个元素)。 - 忽略输入参数:函数接收的参数
pass_enc
(所谓的“加密密码”)会被拆分为数组tab
,但后续代码中,tab
的值从未被实际使用(变量o
虽从tab
取值,但立刻被tab2[i]
覆盖)。 - 字符串拼接逻辑:
- 第一个循环:取
tab2
的前6个元素(索引0-5),转换为字符后拼接,得到"FAUX P"
(ASCII码70→'F'、65→'A'、85→'U'、88→'X'、32→空格、80→'P')。 - 第二个循环:取
tab2
的中间元素(索引6-16),转换为字符后拼接,得到"ASSWORD HAH"
。 - 最后补充
tab2
的第17个元素(65→'A'),最终拼接结果为"FAUX PASSWORD HAHA"
。
代码整体效果
- 无论用户通过
prompt
输入什么密码(h
),调用dechiffre(h)
都会返回固定结果"FAUX PASSWORD HAHA"
(其中“FAUX”是法语“假的”意思,整体可理解为“假密码,哈哈”)。 - 代码中的“解密”是伪逻辑,本质上是一个返回固定字符串的函数,与输入无关。
简单说,这段代码看似在解密密码,实则无论输入什么,都会输出“FAUX PASSWORD HAHA”。
- 刚好我没看懂,就发现也没啥用,后面看了其他大佬的解析,发现答案就在明面上
\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进制串就是答案,我们需要将他们去掉逗号转成字符即可--可以在浏览器终端运行如下代码即可。
function de(){var p = "55,56,54,79,115,69,114,116,107,49,50";var array_temp = p.split(",");var result = "";for(i=0;i<array_temp.length;i++){result += String.fromCharCode(array_temp[i]);}console.log(result);
}
de();
最后记得:Flag格式为 Cyberpeace{xxxxxxxxx}
1.3 结果
大家多多尝试一下有没有更好的方法吧!
互动环节
- 各位大佬们是否有更优的实现方式?欢迎分享代码
- 评论区聊聊吧~