当前位置: 首页 > article >正文

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


http://www.kler.cn/news/290147.html

相关文章:

  • UART串口通信——FPGA学习笔记9
  • tekton什么情况下在Dockerfile中需要用copy
  • anaconda创建虚拟环境
  • 机器学习数学公式推导之高斯分布
  • 雨情教务排课系统
  • 数字化转型升级探索(二)
  • Java | Leetcode Java题解之第387题字符串中的第一个唯一字符
  • 计算机网络 数据链路层2
  • 网络编程学习:TCP/IP协议
  • 【安全科普】学完网络安全出去能做什么工作?
  • 【ES实战】Elasticsearch中Task的简单管理说明
  • css加载一张图片 设置整个页面背景
  • 淘宝扭蛋机小程序开发,吸引更多的消费者
  • 【嵌入式学习笔记】---- STM32里的DMA
  • 小皮面板webman ai项目本地启动教程
  • 阿里云技术深度解析与实战应用:构建高效短信验证系统
  • 9/3 链表-力扣160 、203、206
  • Redis进阶(二)--Redis高级特性和应用
  • 总线操作与定时
  • 当采用 JSON 格式的数据进行响应时,对象是否需要序列化取决于什么?
  • 9/4 链表-力扣 234、19
  • MySQL Email验证流程详解:从注册到激活!
  • Proxyless的多活流量和微服务治理
  • 重生之我们在ES顶端相遇第10 章- 分分分词器的基本使用
  • 统计学习与方法实战——K近邻算法
  • Python:解锁高效编程与数据分析的钥匙
  • 传统CV算法——边缘算子与图像金字塔算法介绍
  • ES6基础----proxy的使用
  • 10、Django Admin修改标题
  • Redis面经