type
status
date
slug
summary
tags
category
icon
password
目的:探究某次元的信息加密方式
抓包

如图,在应用中我们搜索一点东西,能抓到这些内容,在句号之前是固定344长度的数据,句号后面是不固定长度的数据,可以猜测这些内容是我们搜索出来的东西的密文。句号之前固定长度的数据应该是key
flutter恢复

我们解包apk可以发现它是flutter框架的app,那程序的主要内容都在libapp.so里面,这个文件内容庞大且没有符号表,手动定位我们需要的函数是不现实的。
blutter配置使用
这时候就需要用上我们的blutter工具
直通车https://github.com/worawit/blutter
下好过后进入blutter目录执行初始化环境的脚本
这一步是为了避免出现ICU库报错
然后需要GIT和CMAKE,并在VS的工具中把CMAKE相关扩展都装上
其他问题没遇到,不知道还有没有其他环境支持
使用
把flutter框架的apk解包
然后就能得到如下文件

其中,
ida_script
文件夹下的addNames.py
就是我们用来恢复符号表的关键在IDA中打开我们的libapp.so,然后
File -> Script file / Alt + F7
,选择刚刚的addNames.py
文件即可逆向
刚刚我们已经恢复了符号表,那就需要在libapp.so中定位关键逻辑了
前文提到过我们猜测那里是加密后的数据,那就搜索Encrypt或者Decrypt函数


根据函数名,几乎可以确定加密主体有AES和RSA,
然后我们知道是native层的函数,函数地址也知道,逐条分析逆向的难度也不小,可以用frida尝试去hook
最终我们可以在decrypt的0x822d84处函数hook出密文和明文
- 这里函数后面的hex数据都是在libapp.so的基地址上的偏移量

那么这个函数就肯定有用,我们多hook几次仔细看看hook日志
可以发现,我们每次hook这个函数,启动程序后frida一共会hook两次arg0和返回值分别为


arg0的值是固定的,都是密文,返回值一共有两次,第一次是固定16字节的字符串,第二次是明文
tips:
AES的key一般是16字节分别去hook 822d84里的函数

这个是就是关键加密函数,且是根据刚刚的hook结果,我们知道第一次这个函数返回16字节的key,第二次返回明文。所以我们要根据这个函数去追

交叉引用可以发现只有8ab12c调用了两次,那么这就是最关键的整个加密函数
hook出来的完整密文,以"."分开,前面334字节是key,后面是加密数据
理一下这里面的内容,可以得到:
这里就有两个问题,RSA要解密需要私钥;AES解密需要确定其模式,找到key以及可能需要iv
我们先去尝试处理key
过程1 处理key
0x8ab12c函数里我们按0x822d84函数两次调用作分割
由于第二次调用返回值已经是明文了,那么我们只需要关注第一次调用之前和第一次、第二次调用之间的内容

这个函数名尤为扎眼,分配RSAkey,那么hook这个函数试试

这个函数的传入参数就是RSA的私钥,破案了
我们取长一点,把完整私钥提取出来,且hook了好几次,确定了私钥是固定的
得到完整私钥:
写脚本试试解密key,试了几个填充方式过后发现为
PKCS1_no_padding
这里刚好是16字节的数据
过程2 得到明文
16字节的数据,结合hook 822d84函数时两次调用第一次返回值为16字节数据,可以猜测这个16字节就是第一次调用的返回值
验证
我们重新hook一组

密文对上了,那么我将前面334字节密文key解密,应该就和左边hook的结果一致

没问题,我们推测成功
这个十六字节的数据大概率就是解密加密数据时的AES key

通过
1
,能发现是有分配IV的,那么可以确定是AES-CBC模式而在设想中,AES的key我们已经找到,那么就需要找IV,这里的
2
有reverse,比较扎眼,hook试试
可以发现,确实只是把key做了一个反向操作
第一次调用和第二次调用822d84之间,把其他疑似函数都hook尝试了,没有找到我们需要的iv
那么,我们又可以来猜,AES的key和iv就是互为反向的16字节字符串

尝试成功,转成UTF-8导出

总结
还是比较复杂的过程,hook和看逻辑给我看麻了,不过最后搞成功
把加密数据提取出来,以"."为分界线分为
key_enc
和cipher
,最终逻辑为:- 作者:Sh4d0w
- 链接:https://sh4d0w.blog//article/1bc50fad-5ffd-80de-9d8d-fcfcd3a0673a
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。