文章目录
前言
目标站点:aHR0cDovL3NwaWRlci53YW5nbHVvemhlLmNvbS9jaGFsbGVuZ2UvNA
背景:本题主要考验的是JSFuck的逆向能力
提示:以下是本篇文章正文内容,下面案例可供参考
一、JSFuck是什么?
jsfuck源于一门编程语言brainfuck,其主要的思想就是只使用8种特定的符号来编写代码。而jsfuck也是沿用了这个思想,它仅仅使用6种符号来编写代码。它们分别是(、)、+、[、]、!。
简单的举两个例子
!![] // true 变形为 (true+[])[+[]]
!![]+[] // "true" 变形为 ("true")[+[]]
+[] // 0 最终变形为 ("true")[0]
二、使用步骤
1.页面分析
多次翻页后,推断出请求数据加密参数为_signature
2.定位加密位置
通过最简单的搜索方式,我们大致推测,箭头指向的位置就是加密的位置。
3.堆栈跟踪
1.进入断点window.get_sign(),直接映入眼帘的就是JSfuck的源码。
2.将代码复制到我们js调试工具当中,根据()分别拆分成4部分,我们一一去浏览器进行解密
3.解密完成后,可以看到就是AES加密 ,唯独需要注意的就是图中click的位置,他会有一个window.document.onclick 的点击事件检测,我们直接在浏览器中输入查看,他自身到底是什么,我输入后返回的是null,他这值会对应下面的iv和key的生成判断。
4.在执行的话,他会报错先是没有定义Cryptojs,仍然我们通过搜索的方式就可以直接将js抠出来。
然后执行即可完成加密
总结
1.当我们遇到带有自执行的jsfuck代码需要直接忽略掉自执行的(),否则会出现以下情况。
2.当我们遇到带有eval(**JSfuck代码**),这样的执行语句,我们需要直接扣括号内部的代码,要不然仍然无法正确解密
正常浏览器即可实现解密,也可以去指定的解密站点
例如:de4js | JavaScript Deobfuscator and Unpacker
js代码段
var window = {};
var CryptoJS = CryptoJS || (function (Math, undefined) {
var crypto;
// Native crypto from window (Browser)
if (typeof window !== 'undefined' && window.crypto) {
crypto = window.crypto;
}
*************省略*************************
(function () {
let time_tmp = Date.now();
let date = Date.parse(new Date());
let click = null ;
let key_tmp;
let iv_tmp;
if (!click) {
key_tmp = date * 1234;
} else {
key_tmp = date * 1244;
}
if (time_tmp - window.time < 1000) {
iv_tmp = date * 4321;
} else {
iv_tmp = date * 4311;
}
const key = CryptoJS.enc.Utf8.parse(key_tmp);
var iv = CryptoJS.enc.Utf8.parse(iv_tmp);
(function tmp(date, key, iv) {
function Encrypt(word) {
let srcs = CryptoJS.enc.Utf8.parse(word);
let encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString().toUpperCase();
}
window.sign = Encrypt(date);
})(date, key, iv);
})();
function get_sign() {
return window.sign
}
console.log(get_sign())