本帖最后由 lz52zr 于 2021-7-23 12:14 编辑
因为此次破解没有什么难度,所以重点分享了分析前的思路
某视频app由于历史悠久,早期Android开发不规范,导致所有签名都在Java层明文计算,后来提高了安全性,签名算法转移到了native层,但盐值依然以明文的形式储存,再之后以AES加密储存,但密钥和密文放在了一起,和明文几乎没有区别,最后终于分段加密存储,并且更新了盐值,给静态分析带了了很大麻烦。不过旧的盐值并没有被弃用,新盐值仅用在注册登录等安全性要求较高的场景,所以要模拟登录就要解出新盐值
所需工具
IDA -静态分析+动态调试
虚拟机 -提供root运行环境
最开始的思路和之前一样,通过静态分析找出盐值存储位置,解密后导出,但新存储方式比较复杂,分析了一会儿觉得不值等继续深挖,毕竟只是为了获取一个盐值,没必要把人家底裤挖出来,况且下一次更新换个算法,之前努力全白费,所以换成了动态分析,简单快捷。
一 静态分析
动态分析的思路就比较简单了,因为已知加密算法,所以只要找到函数入口,等数据自己过来就行,但是第一步就遇到了困难,使用findcrypt插件无法找出位置
好在用来计算签名的函数被单独放在一个.os里,体积仅40kb,里边包含的函数也仅有100多个。所以拿到.so后逐个函数查看,很快就找到了加密函数的位置
其实这个还是挺好看出来的
比如这是一个SHA256摘要算法
基本上一堆固定参数来回位运算就是了
但这个函数是加密的循环体,如果数据太长需要调用很多次,有代码注入还好说,但我不太会用ida,不确定是否可以注入代码,所以选择了此函数的上一级
在循环体外下断点,那就开始调试吧。
二 动态调试
首先上传android_server,运行并做好端口映射
打开app,ida内选择附加进程
找到入口后直接f9即可
ctrl+s选择需要调试的.so
按g跳转到函数入口(就是上面分析的sub_2340),下断点
app内操作登录一下,成功进入加密函数,并且跟踪到寄存器R1为明文
但这里出现了个问题,盐值并不是直接附加在明文尾部
不过问题不大,因为加密是分块计算的,所以允许分段输入
[JavaScript] 纯文本查看 复制代码
let sign = crypto.createHash(algorithm)
sign.update(data1)
sign.update(data2)
sign.update(data3)
sign.update(data4)
sign.update(data5)
……
let hash = sign.digest()
最后肯定会有盐值明文过来,直接f9,果然传入了8字节(byte)明文
继续f9
把得到的四组8字节组合得到32字节明文,就是所需的盐值了
然后验证一下
可以看到sign已经被服务器接受
最后
因为不知道分析结果是否属于成品,所以全程打码并且隐藏了一部分信息,新人第一帖,望见谅 |