看雪论坛作者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位数组。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 原创,转载请注明来自看雪社区