题目
小宁发现了一个网页,但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} )
工具
Burpsuite
火狐浏览器
String.fromCharCode转换
十六进制转换
解题过程
随意输入密码并使用burpsuite抓包,看到response返回了一段JS代码,这段JS代码应该是解题的关键。
首先分析该 JavaScript 函数,名为 dechiffre
,用于解密密码。
pass_enc
是作为参数传入的加密后的密码。pass
是一个字符串,包含以逗号分隔的一组数字,表示明文密码的 ASCII 值。tab
是将传入的加密密码pass_enc
以逗号分隔后的数组。tab2
是将明文密码字符串pass
以逗号分隔后的数组。- 在两个
for
循环中,通过将数组tab
和数组tab2
中的对应元素转换为字符,拼接成字符串p
。 - 在第一个循环中,当
i
等于 5 时,通过if(i == 5)break;
条件提前结束循环。 - 在第二个循环中,当
i
大于 5 且小于k-1
(k
的值为数组tab2
的长度)时,继续将字符拼接到字符串p
中。 - 最后,将数组
tab2
的倒数第二个元素转换为字符并拼接到字符串p
中。 - 最后,将拼接好的字符串赋值给变量
pass
并返回。
其实这段代码的作用就是将传入的字符以及最初定义的pass根据String.fromCharCode转换为一段字符,接着将转换后的pass字符串根据弹窗弹出,也就是说无论输入什么这段代码都会弹出这段字符串。
于是接着分析下一段字符串:
- 这串被加密的字符串,其实是十六进制的转义序列,这是一种在计算机编程中用来表示特殊字符或二进制数据的方法。它通常以"\x"开头,后面跟着两个十六进制数字,表示一个字节的数值。例如,"\x41"表示ASCII字符"A"的十六进制值。
- 接着将这串加密字符串作为参数传入
dechiffre
函数并根据String.fromCharCode转换。
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"));
首先我们将这串十六进制字符解码
接着将解密出来的一组数字转换得到一串字符,集合题目的flag格式可以得到flag:Cyberpeace{786OsErtk12}