逆向参数分析:
思路:
如果参数出现的次数比较少,完全可以使用全局搜索
如果参数出现比较多,建议使用跟栈
网站: 下面运行结果
import base64
# 解密
result = base64.b64decode('aHR0cHM6Ly93ZWIuZXd0MzYwLmNvbS9yZWdpc3Rlci8jL2xvZ2lu'.encode('utf-8'))
print(result)
但是password 出现的太多了,我们又不能逐个打断点进行分析,这次采用跟栈
讲一下跟栈,我们的数据是经过很多次js调用得到的,栈是先进后出,所有最上面的是最后调用的 ,跟栈就是倒推,找到js加密的函数位置
后面表示是js文件的哪一行
注意在233行需要再打一个端点让程序走到这里。(如果不打断点是没有数据信息的 ,打程序终止再这个地方)
后面的数字就是我们应该打断点的位置。
注意断点尽量打在我们想得到数据所在的行,使其还没有执行
进入passwordEncrypt函数内部:
哎熟悉啊,之前有些过模板套进去即可 ,但是后面获得的数据需要进行相应的转化
先 .ciphertext 然后在转化为 字符串 然后再大写
代码:
下面 给出代码:
var CryptoJS = require('crypto-js')
function AesEncrypt(text) {
var key = CryptoJS.enc.Utf8.parse("20171109124536982017110912453698"),
iv = CryptoJS.enc.Utf8.parse('2017110912453698'),
srcs = CryptoJS.enc.Utf8.parse(text),
// CBC 加密方式,Pkcs7 填充方式
encrypted = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString().toUpperCase();
}
function AesDecrypt(Key,Iv,text) {
var key = CryptoJS.enc.Utf8.parse(Key),
iv = CryptoJS.enc.Utf8.parse(Iv),
srcs = text,
// CBC 加密方式,Pkcs7 填充方式
decrypted = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
console.log("加密", AesEncrypt("123444"))
对比一下:
over!!!
总结:
这个案例讲解了如何跟栈,总的来说 我们从结果出发,一步步向前寻找,找到加密或者解密的位置然后再相应的函数打上断点,(这个端点会先被卡住,因为是栈),大家一步步多尝试一下,逆向的学习在于模仿和总结。