分析某app的密碼加密
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,注意編碼順序;
后面也是登陸成功了。
