作者:[局外人]

分类:[技术分析]

标签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函数的实际逻辑

  1. 固定的“密钥”:函数内定义了一个固定字符串 pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65",这是一系列ASCII码的逗号分隔值,拆分后得到数组 tab2(共18个元素)。
  2. 忽略输入参数:函数接收的参数pass_enc(所谓的“加密密码”)会被拆分为数组tab,但后续代码中,tab的值从未被实际使用(变量o虽从tab取值,但立刻被tab2[i]覆盖)。
  3. 字符串拼接逻辑
  • 第一个循环:取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 结果

大家多多尝试一下有没有更好的方法吧!

互动环节

  • 各位大佬们是否有更优的实现方式?欢迎分享代码
  • 评论区聊聊吧~