2015阿里&看雪移动安全挑战赛-第二题

来源:互联网 发布:linux版本的abaqus6.16 编辑:程序博客网 时间:2024/05/01 14:11

2015阿里&看雪移动安全挑战赛-第二题
题目传送门:AliCrackme
网上已经有很多writeup,我也是按照乌云上的2015移动安全挑战赛(阿里&看雪主办)全程回顾的基本思路来想的。但作为一个新手,就算照着教程来做也会踩到很多坑。所以我想把自己解题过程中遇到的一些细节问题跟大家分享一下。
文章中提到的环境配置是按照看雪论坛非虫的《Android软件安全与逆向分析》配置的,这本书很棒,讲的很详细。在这里安利一波。

0x01

app安装完后长这样:
主界面
输入错误的密码会提示校验码错误。我们先看看这次日志会不会有什么输出。
LogCat
可以发现,每次输入密码提交后,日志总会输出 SecurityCheck Started...,结合上一题的经历,我们能够从代码中发现日志输出语句。
那么我们就来看看从jar文件中能够发现什么。

0x02

jar
从代码中可以看到,校验成功与否是由securityCheck()这一方法的返回值决定的。而在它的Java代码中,我没有找到这一方法,也没有找到日志输出的语句。后来看乌云上的资料,在反编译后的lib文件夹下找到了libcrackme.so文件。根据提示,用IDA打开了这个文件。
(注:某些版本的IDA不支持调试so文件,这里我用的是6.6版本)
IDA
发现了securityCheck()方法,继续往下找,我们在0x1284处发现了日志输出函数android_log_print
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保存。
改之前代码:
IDA
改之后代码:
IDA

0x04

so文件修改完保存好后,将它与原来的反编译文件一起重新打包签名,生成一个新apk。然后将apk重新安装到虚拟机上。运行后观察输出日志。
LogCat
可以发现,日志输出了一个字符串aiyou,bucuoo,经验证,该字符串为正确的密码。
成功

0 0
原创粉丝点击