某视频app已知签名算法获取盐值(salt)
本帖最后由 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为明文
但这里出现了个问题,盐值并不是直接附加在明文尾部
不过问题不大,因为加密是分块计算的,所以允许分段输入
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已经被服务器接受
最后
因为不知道分析结果是否属于成品,所以全程打码并且隐藏了一部分信息,新人第一帖,望见谅 SysEntry 发表于 2021-7-23 15:11
没混淆流程还是很清晰的.盲猜加密函数有点强.
确实流程比较简单,特别是此app还单独把签名部分拿了出来。实际上这个.so里就包含了两个加密过程,一个是计算api sign,还有一个是计算apk签名(修改apk重新签名会闪退),因为计算apk签名部分用了特征比较明显的x.509(包含BEGIN CERTIFICATE),所以很快就判断出api sign是哪个了 SysEntry 发表于 2021-7-24 19:05
FindCrypto 竟然没提示出来。。
因为把四个初始值
A=0x01234567
B=0x89ABCDEF
C=0xFEDCBA98
D=0x76543210
都拆开了, 比如
A=0x01234566+1
这样FindCrypto就没办法了 图没上传成功? Hmily 发表于 2021-7-23 10:59
图没上传成功?
是的,编辑的时候刷新了一下,想再编辑就审核了,现在电脑没在身边,回去把图补上,不好意思{:1_937:} lz52zr 发表于 2021-7-23 11:06
是的,编辑的时候刷新了一下,想再编辑就审核了,现在电脑没在身边,回去把图补上,不好意思
嗯,回头补下。 新人赞一个,等待上图。 学到了,等图 qweqwezaq 发表于 2021-7-23 14:21
学到了,等图
我看有图啊,难道还不行吗:eee lz52zr 发表于 2021-7-23 14:24
我看有图啊,难道还不行吗
换电脑看,有了 学习一下,谢谢分享{:1_921:} 没混淆流程还是很清晰的.盲猜加密函数有点强.