RSA加解密-iBuck

rsa加解密
- RSA加密属于一种非对称加密算法,对于相同内容的每次加密结果也都是不一样的,但是用私钥解密后的结果却都是可还原的
rsa生成的密匙对

可以通过RSA的私钥提取公钥

公钥提取modulus(模数)

1. 分析iBuck登录加解密
本章只分析软件的登录加解密验证
fiddler抓登陆包

先通过frida-trace 寻找RSA加解密相关的函数接口
frida-trace -m "*[* *rsa*]" -U iBuck
找到相关函数接口
+[BKDataEncrypManger bk_rsaDecryptForJson:0x280848cc0]
+[BKDataEncrypManger bk_rsaEncrypJsonForDictionary:0x282664b80]
然后可以通过hook接口获取到参数信息


再通过rsa的通杀脚本来获取密钥相关的信息
frida -U iBuick -l .\ios_rsa.js

接下来去ida解析的字符串里面搜索一下RSA公钥的编码特征看是否能搜到:一般是MIGfMA0开头的

直接搜索到了三组硬编码,那接下来可以解析一下这三个硬编码的模数看哪一个和我们刚刚通过RSA通杀脚本获取到的模数相同。
通过计算获取到正确的那一组硬编码

确定了之后,先在ida里面查看一下这个公钥的调用,通过交叉引用找到调用的函数

到了这边之后发现只是返回了一个公钥的值,继续再往上一层查看可以跟到下图解密函数

有点奇怪,第二天使用frida的时候报错

- 不知道是哪里的问题,重启刷机好了
找到这个解密函数之后,可以对解密函数进行hook查看它的参数和返回结果去验证他的解密过程
插入log获取参数和返回值

执行hook
frida-trace -m "*[BKRSA decryptString:publicKey*]" -U iBuick
重新点击登录查看参数和返回值的值

从这里可以获知两点:
a. 未解密字符串的值是服务器的返回包,可以在fiddler里面找到

b. 这个公钥是用来解密返回包的,解密的返回值是**{}**
既然它是用公钥来解密服务端返回的数据包,这里我们可以猜测这个加密逻辑是:
在客户端使用公钥加密->发送到服务器用私钥解密
在服务端使用私钥加密->发送给客户端用公钥解密
来验证确认一下:
在ida里面搜索加密相关函数发现使用公钥私钥的都有,那我们接下来使用frida-trace来hook确认一下解密服务器返回包的时候调用的是哪个函数

frida-trace -m "*[BKRSA enc*]" -U iBuick

根据hook返回结果发现是使用BKRSA encryptString:privateKey函数私钥加密,那接下来插入log来查看一下它的参数和返回值

执行hook
frida-trace -m "*[BKRSA encryptString:privateKey*]" -U iBuick
返回值:

接下来验证一下:
- 用公钥解密服务器下发的data包


- 用私钥加密重放发送给服务器看能否通过验证

验证通过,和我们点击登录返回相同的结果(这个app有限时防重放机制,发送时间过去太长的包重放是会失败的)

根据验证的结果发现,本app在客户端有两对密匙,两种加密方式,一种是使用公钥加密服务端私钥解密,一种是使用私钥加密服务端公钥解密
关于这个app加固可以把客户端存储的密钥进行加密,例如将密钥存储为文件通过解密文件解析出公钥会让安全性更高一点
- 标题: RSA加解密-iBuck
- 作者: xiaoeryu
- 创建于 : 2023-07-09 15:34:28
- 更新于 : 2023-07-09 15:50:12
- 链接: https://github.com/xiaoeryu/2023/07/09/RSA加解密-iBuck/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。