分析某app的密码加密

348次阅读  |  发布于3年以前

1、抓包,可以看到密码是被加密过的:

2、ida打开对应so,发现没有被混淆,但是算法应该是有很大问题:

3、转换一下16进制的公钥, 我这里使用py的cryptography转换的,发现正好是1024size的共钥模数,指数对应的是65537。 然后点进去encrypt_one_group后继续分析:

4、进去第一反应就是很懵圈,为什么会有一个init和crypt,并且上面已经encrypt了,而且看这个init多半跟rsa没多大关系,看这个s是被填充了128个无符号的0,之后在初始化这个s的数组,这就更加确定下面两个函数的操作是加密之后的,因为rsa加密长度过长会进行切分,每一轮不大于117,等于117输出的位数就是128(不了解的可以去了解一下)

5、用frida 直接hook一下ch_crypt的入参和最后a7的返回值,可以看到s init之后的128位数组。 crypt前 s

a7 正好是128位,说明已经被rsa加密好了:

crypt后

a7

6、先用c还原一下crypt这个函数, 这里就不贴代码了,大致看一下这个函数的内容是在做异或运算:

重点是这句代码,在c里面打印一下每轮 (result + ((v6 + (result + v5)) & 0x7F)) 的值:

这个ch_hex_map才是最终异或的映射表,打印一下结果:

这不完全对应上了吗?

7、现在就差这个rsa不知道啥情况了,去里面大概瞟一眼,然后先把流程走通,这都是很明显的pkcs1v5的填充了。

PKCS1-v1_5 编码

a) 生成一个 伪随机非零串PS , 长度为 k – mLen – 3, 所以至少为8, 因为 k-mLen>11 b) 将PS, M,以及其他填充串 一起编码为 EM, 长度为 k, 即: EM = 0×00 || 0×02 || PS || 0×00 || M

重点来了:

1、正常base64编码字符串 A-Za-z0-9+/=,而它这个一看很像但又不像,如果拿下面这个顺序的编码加密出来的话差别又很大,这是因为它自己的base64函数把这个编码又重新拆分成A-Za-z0-9-_=。

2、开头第一张图片有一个占位0x1,这也是一个很重要的坑,最后一位永远是0x1。

总结:

1、计算明文加密好的长度+1填充0x1;

2、分组rsa pkcs1v5加密 之后并与128位码表异或;

3、base64,注意编码顺序; 后面也是登陆成功了。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8