分析某app的密码加密
2021-11-27 18:59:00 Author: mp.weixin.qq.com(查看原文) 阅读量:33 收藏


看雪论坛作者ID:wbwnnx

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,注意编码顺序;
后面也是登陆成功了。

 

看雪ID:wbwnnx

https://bbs.pediy.com/user-home-921346.htm

*本文由看雪论坛 wbwnnx 原创,转载请注明来自看雪社区

# 往期推荐

1.利用Lighthouse进行覆盖率统计及其优化

2.从代码的角度学习AFLSMART的特性

3.通过ObRegisterCallbacks学习对象监控与反对象监控

4.Android Linker详解

5.内核层的三种Hook技术的使用

6.vmp 相关的问题

公众号ID:ikanxue

官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458406740&idx=1&sn=94096cecc4a0c7733508185d48653a6b&chksm=b18f7fde86f8f6c8e4f7ba89f3bb2f8a506472f2757dc6c41edacb8ac04d1f8eedd435cabc24#rd
如有侵权请联系:admin#unsafe.sh