移动安全(七)|实战获取某APP登陆算法

2020-07-27 16:53:58 浏览数 (1)

0x00背景

本文依然是团队大佬 非尘 学习逆向的学习笔记,这一系列都将以实验的方式进行知识点学习和总结,后续将持续更新,不喜勿喷~

本文及后续文章中使用到的靶场地址:

https://adworld.xctf.org.cn/task/task_list?type=mobile&number=6&grade=0。

0x01实验目的

获取xxxAPP的登录加密算法。

0x02实验工具

Jeb,Fiddler,雷电模拟器,真机nexus5,spyder(hook用的,也可以notpad )

0x03实验分析

1)首先将app安装到雷电模拟器中,打开运行,点击登录,使用Fiddler抓取登录包:

2)通过抓包分析发现,该app请求登录的时候,传递的数据只有sign加密未知,剩下几个参数都是已知的,因此破解加密算法的关键就在sign这个参上。使用jeb搜索字符串”sign”,发现多处存sign,然后可以通过别的字段来进行定位,通过分析登录包和代码可得知,多处存在sign区别在system_name,然后在我们初步断定的地方下断点来动态调试(在所有你认为可疑的地方下断点是非常必要的,定位关键代码往往是我们破解的关键),下断点的快捷键是ctrl b。

3)然后使用jeb开始动态调试,发现成功断在刚刚的位置,然后分析此处的代码逻辑。通过代码可知,sign的取值为b.a()的返回值,传递进去两个参数,一个为请求参数的hashMap值,注意,此时参数params这个集合中是没有将time添加进去的,另一个为时间戳,跟进b.a(),发现params.getURLHashMap是HashMap类型的(HashMap中存储的是键值对方式),详细代码分析如图所示:

4)通过分析可知,sign的值是将如下图所示的几个参数排序后,取其值然后进行某些字符的替换,然后进行MD5处理,然后拼接上一固定字符串和时间戳进行二次md5操作即为最终的sign值。

5)为了验证我们的逻辑是否正确,我们可以采用多种方式来进行验证,如动态调试获取相应的返回值,hook获取返回值,匿名管道(哈哈,也称log日志打印,smali插桩)方式验证。在这里我使用动态调试和hook的方式来进行验证(由于不会将java中hashmap类型转为js中的hashmap类型,由此借助动态调试观察一下加密前的参数值)。首先在tostring处下断点,然后启动调试到此处,查看对应寄存器的值v9,可发现为其值为account=18434366456&clientid=1&device_id=865166020016286&ip=172.16.2.12&modules=cloudlogin:1&password=qwerasdf&siteid=10001&system_name=android&type=android,和我们分析的完全一样

6)然后使用Friday的hook查看两次md5的值,发现最后一次hook的值和我们抓包获取的值完全一样,验证了我们的分析没有错误。

7)hook的代码如图

0 人点赞