js逆向——RSA实战案例讲解

受害者网站:http://www.15yunmall.com/pc/login/index

检查超时,这个我们不管他

直接分析参数,有2处加密位置,分别为password和csrftoken

只要是能够跟栈的,一律先在send的位置下断 

很快就跟栈找到加密数据的位置

RSA分析的重点:

1、new RSA(); //反正必须要new一个对象

2、setPublicKey; 一定要调用一个方法设置公钥(名称无所谓),需要有公钥和mode(一般为10001)

3、加密; 必须用到BigInt大数的运算

RSA扣取代码平均2000行左右,行数一定要大致对的上

把关键代码扣取出来,检查上面提到的new;setkey;publickey,mode是否都全面了!!!

var public_key="00bdf3db924714b9c4ddd144910071c282e235ac51371037cf89fa08f28b9105b6326338ed211280154c645bf81bae4184c2b52e2b02b0953e7aa8b25a8e212a0b";
var public_length="10001";
var rsa = new RSAKey();
rsa.setPublic(public_key, public_length);

一、RSA四件套测试

首先测试RSA必备的4件套(new,setkey,mode,publickey)能否正确得到了!!

注意一定要新开一个空白页面!!

提示:RSAKey is not defined,我们再次返回刚刚的界面去寻找RSAKey的定义,然后把代码扣取下来

我们在new RSAKey()上面打上断点

算法单独使用一个文件来实现,一共也就100多行,直接全部扣取下来

新扣取的代码一律放到最上面, 再次运行,报错:BigInteger is not defined

于是就再次回到之前的网页下断点分析 BigInteger的来源

发现又是一个500行左右的单独文件

直接全部复制下来,放到脚本的头部

再次运行就没问题了,注意脚本的命名要使用英文!

否则会报错:由于此 URI 格式不正确,因此在工作区尝试绑定“snippet:///%u5300%u52A0%u901F%u5546%u57CE”时失败。

二、RSA加密测试

尝试使用我们自己扣取的RSA算法来加密文本"123456"

结果报错,我们就继续缺啥补啥

同样把单独文件全部扣取下来

然后又报错:rng_psize is not defined

直接搜索rng_psize的定义位置

再次运行发现已经可以在浏览器的环境下正确进行RSA加密了

三、本地运行RSA代码

尝试使用js调试工具在本地运行代码,结果报错:navigator 未定义

本地一般都是确实浏览器的环境所导致的!!!

补环境主要2点:补/删(需要读逻辑)

删:删除的代码不参与最后的计算(只是一个逻辑判断)

补:参与本地计算/需要提交到服务器

对于数量不多的情况,可以考虑删除代码

直接在你不确定是否执行的代码前面打上debugger(本地脚本)

结果没用断下来,说明可以直接删除 

为了严谨起见,我们在fd中把相关代码注释掉

再次加载代码

一个分支语句到底走哪一个?我们在流程的最前面加上一个debugger看看到底进入哪一个流程

if(j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
  BigInteger.prototype.am = am2;
  dbits = 30;
}

else if(j_lm && (navigator.appName != "Netscape")) {
  BigInteger.prototype.am = am1;
  dbits = 26;
}
else { // Mozilla/Netscape seems to prefer am3
  BigInteger.prototype.am = am3;
  dbits = 28;
}

这样前面的2条分支语句就可以注释掉了

再次在fd当中加载代码,这次成功了

然后我们尝试执行加密函数,也是顺利得到了加密结果

补充知识点:

函数返回undefined说明函数没用返回值,但是也有可能在函数的内部a.param.key=xxx这样赋值

ok,今天的你就到此为止吧,see you tomorrow

RSA是一种非对称加密算法,由三位科学家Rivest、Shamir和Adleman共同发明,在加密和数字签名领域发挥着重要作用。RSA算法基于数论中的两个重要难题:大整数分解和模幂运算。 RSA算法的核心概念是公钥和私钥。在加密过程中,首先需要生成一对密钥,其中一个是公钥,可以公开给其他人使用,而另一个是私钥,必须保密。通过公钥可以将信息进行加密,而只有使用私钥才能解密。 RSA算法的加密过程如下:选择两个大素数p和q,并计算它们的乘积n=p*q作为所需的大整数。再选择一个与(p-1)*(q-1)互质的正整数e作为公钥,其中1 < e < (p-1)*(q-1)。然后计算d,满足(d*e) mod ((p-1)*(q-1)) = 1,并将d作为私钥。公钥对应着(n, e),私钥对应着(n, d)。 对于明文M,加密后得到密文C,加密过程为C = M^e mod n。解密过程为M = C^d mod n。由于大整数分解问题的复杂性,只有获得私钥才能成功解密,保护了通信的安全性。 RSA算法广泛应用于计算机网络和电子商务中,例如在网站上进行数据传输过程中,使用RSA加密算法保护数据的机密性和完整性,确保数据不被窃取或篡改。 需要注意的是,尽管RSA算法在安全性上相对较好,但其加解密过程消耗较大的计算资源,在处理大量数据时效率可能较低。因此,在实际应用中,常常将RSA与其他加密算法结合使用,以平衡安全性和效率的要求。 总之,RSA算法作为一种非对称加密算法,通过公钥和私钥的配对实现信息的加密和解密。它在数据安全领域的应用广泛,为保护通信和数据的安全做出了重要贡献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值