2015阿里&看雪移动安全挑战赛-第二题
来源:互联网 发布:linux版本的abaqus6.16 编辑:程序博客网 时间:2024/05/01 14:11
2015阿里&看雪移动安全挑战赛-第二题
题目传送门:AliCrackme
网上已经有很多writeup,我也是按照乌云上的2015移动安全挑战赛(阿里&看雪主办)全程回顾的基本思路来想的。但作为一个新手,就算照着教程来做也会踩到很多坑。所以我想把自己解题过程中遇到的一些细节问题跟大家分享一下。
文章中提到的环境配置是按照看雪论坛非虫的《Android软件安全与逆向分析》配置的,这本书很棒,讲的很详细。在这里安利一波。
0x01
app安装完后长这样:
输入错误的密码会提示校验码错误。我们先看看这次日志会不会有什么输出。
可以发现,每次输入密码提交后,日志总会输出 SecurityCheck Started...
,结合上一题的经历,我们能够从代码中发现日志输出语句。
那么我们就来看看从jar文件中能够发现什么。
0x02
从代码中可以看到,校验成功与否是由securityCheck()
这一方法的返回值决定的。而在它的Java代码中,我没有找到这一方法,也没有找到日志输出的语句。后来看乌云上的资料,在反编译后的lib文件夹下找到了libcrackme.so
文件。根据提示,用IDA打开了这个文件。
(注:某些版本的IDA不支持调试so文件,这里我用的是6.6版本)
发现了securityCheck()
方法,继续往下找,我们在0x1284处发现了日志输出函数android_log_print
0x03
那么,securityCheck
的执行流程是怎样的?从乌云上的文章解释得很详细:
在securityCheck这个方法调用前,在init_array段和JNI_Onload函数里程序都做了些处理,而在securityCheck方法的最后有一个判断,将用户输入和wojiushidaan做比较。尝试直接输入wojiushidaan,发现密码错误,因此可以猜测前面一大段逻辑的作用就是会把这个最终的字符串改掉。此时的思路是只需知道最终判断时候这个wojiushidaan地址上的变换后的值就行了。尝试使用IDA调试发现一旦attach上去,整个程序就退出,想必一定是在之前的代码中有反调试的代码。
既然我们要得到变换后的值,我们就可以借助日志输出函数将我们想要得到的值输出出来就好了,因此,我们需要对so文件进行一下修改。
- 将从0x1284到0x129C处都用NOP改写(NOP为空操作)
- 在0x12AC处调用android_log_print
函数
- 为了不影响R1的值,把0x12A0处的R1改成R3
- 将0x12A4处的R1改成R3
- 将0x12A8处指令改成MOV R0,#4
因为so为二进制文件,所以我们修改的也是二进制。
- NOP对应的二进制值为00 00 A0 E1
- android_log_print
对应的二进制值为88 FF FF EB
- 0x12A0处的值应改为60 30 9F E5
- 0x12A4处的值应改为07 20 93 E7
- MOV R0,#4
的值为04 00 A0 E3
在IDA中,选中某一行,进入Hex View选项卡就可以看到该行的二进制数值。按下F2键可以进行编辑,编辑好后再按下F2键可以进行保存。此时回到IDA View界面就可以看到程序已经改好了。但注意,IDA中的修改只是保存在了它自己的数据库里,并没有保存到so文件里。所以为了能够直接编辑so文件,我们可以使用UltraEdit来进行编辑。在IDA中确认无误后可将修改内容通过UE保存。
改之前代码:
改之后代码:
0x04
so文件修改完保存好后,将它与原来的反编译文件一起重新打包签名,生成一个新apk。然后将apk重新安装到虚拟机上。运行后观察输出日志。
可以发现,日志输出了一个字符串aiyou,bucuoo
,经验证,该字符串为正确的密码。
- 2015阿里&看雪移动安全挑战赛-第二题
- 2015阿里&看雪移动安全挑战赛-第一题
- 2015移动安全挑战赛MSC(第二届)第一题解题思路
- 阿里移动安全2015年第二季度报告
- 2015移动安全挑战赛全程回顾 并附上解法
- 2015ali android挑战赛第二题
- 阿里移动安全 Writeup
- 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路
- 阿里移动安全发布《2015物联网安全年报》,威胁攻击日益凸显
- 20万大奖等你拿!阿里聚安全攻防挑战赛报名开启!
- 巴斯光年探险阿里聚安全攻防挑战赛!决战12月28日!
- 你不知道的声纹识别,尽在阿里聚安全攻防挑战赛!
- 算法开启的人工智能时代!阿里聚安全算法挑战赛公开报名!
- 2015阿里安全峰会
- 看雪安全峰会,几维安全携国内首款全平台移动代码虚拟机KiwiVM参展
- 阿里笔试第二题
- 2015ali android挑战赛第二题之反调试技术解析
- Google中国编程挑战赛第一轮Room18第二题
- view的事件分发机制的学习
- 基于DNN的艺术风格生成算法的应用
- static
- [leetcode]141. Linked List Cycle
- PowerDesigner 逆向工程 unable to list the tables
- 2015阿里&看雪移动安全挑战赛-第二题
- 第91讲:sparkStreaming基于kafka的Direct详解
- unity源码解析Texture
- 双目视觉简介
- 墓碑移动最短路求解问题
- JavaScript-函数柯里化
- HDU 3111 Sudoku(数独,还是深搜)
- 关于双目立体视觉的一些总结(二)
- 338. Counting Bits 数字的二进制中1的个数