CTF安卓逆向练习第三弹
2017-06-07 13:38
656 查看
CTF安卓逆向练习第三弹–静态分析及monitor使用
写在前面的话:这次练习的是阿里安卓CTF2015年比赛的第一题,一个比较简单的题,主要练习一下monitor的掌握以及静态的java逻辑分析等能力APK:AliCrackme_1.apk
题目:找到密码
基本概述与整体思路
刚拿到apk,还是一般的思路,先在模拟器上跑起来,看看这道题让我们干什么。app界面很简单,也很清楚,在输入框里输入密码,点击登录按钮实现登录,我们的目的就是破解到这个密码。下面看一下apk的结构,很好,没有so文件等,拖进jeb中,很清楚的就编译出来,可以看到各个类方法的名字。整体来说这个apk还是比较简单的,没有用到so,没有加壳,没有混淆,纯java的一个程序。下面我们就用jeb在java层面上进行分析即可。
关键代码定位
因为解题需要,我们要尽量快速定位到关键代码处。可以先在strings.xml文件中看看有没有能给我们帮助的信息,在这里能看到一个“恭喜!!!破解成功!!!”的字符串,找到对应的string name=dialog_good_tips然后我们在public.xml文件中找到这个字符串的id,可以用ctrl+F快捷键找寻,发现这个id=0x7f0a0012,对应的十进制是2131361810
然后在伪java代码处找到这个2131361810,发现这是一个showDialog显示调用的一个方法
接下来找一下有谁调用了这个方法,找到这个地方之后,从下往上看,很明显能看到一个if判断语句,如果想走到下面的分支,那么就要满足上面的判断条件。再来看这个判断条件,前半部分很明显,都是判断不能为空之类的,后半段有一个很明显的判断,就是这个v4寄存器要和v2寄存器的内容相等,那么我们可以说这个v2寄存器就是我们要找的
接下来继续看v2,发现他是通过bytesToAliSmsCode方法得到的,而这个方法有两个输入值,一个是v5,一个是v3。继续向上看,很容易看到v3就是我们这个框里我们自己输入的值,而v5则是通过getTableFromPic这个方法得到的。
至此,再从上往下屡一下,我们知道了这个app总体的逻辑:通过getTableFromPic得到参数v5,通过getPwdFromPic得到参数v4的值,然后将我们输入的密码v3和之前得到的参数v5通过bytesToAliSmsCode做一定的变换,得到参数v2,最后将v4和v2做比较,相等则完成破解。
monitor的使用
在分析了一定的代码逻辑之后,我们就要确定这些传递的参数的值都是多少,观察伪java代码,发现这个apk在编写的时候已经吧我们需要的v5、v4、v2等参数用Log.i的方式记录在日志中了,而且其相应的“table”、“pw”、“enPassword”等名字也很有代表性,也进一步验证了我们之前分析的想法。接下来我们就要观察这些日志的内容了,打开Android自带的monitor,在Android安装包中tools文件夹里就有
在接下来打开的monitor中,我们可以增加筛选条件,比如application的名字、tag等,只要方便就可以
然后我们在模拟器中将这个app打开,随便输入一串密码,然后点击登录按钮,然后观察monitor的值。很清楚的显示了参数的值,其中table就是v5的值,enPassword就是我们输入的值v3,pw就是用来比较的值v4,这个v4就是我们要找的flag,也就是最终的密码
在这里我们可以看到输出的值都是很怪异的汉字,其中pw的值是“义弓么丸广之”,这是将一串数字经过了一定的变换,最后才得到这一串密码,那么这个变换是什么样的?这就需要我们接着进行分析。
静态详细分析
接下来,根据上面的一些逻辑关系,我们再把几个关键的方法分析一下,包括getTableFromPic、getPwdFromPic、bytesToAliSmsCode几个方法。首先是getTableFromPic,可以看出总体思想是通过一个图片,读取图片的字节,然后做相应的转换。同理,getPwdFromPic也是相同的思路,这里就不详细概述了。
接下来是bytesToAliSmsCode方法,其思路是把得到的字符串进行一系列位的变换。
快捷方法
在经过上面的一些分析之后,我们还是感觉有些头大,难道真的要将我们得到的密码照着算法进行这些复杂的转换吗?这里我们再次明确一下我们做这个逆向的目的,我们的目的只是得到密码,而不是对整个app的算法进行解析,因此有一个简便快捷的方法。经过分析我们知道这个密码是一串数字,每个数字经过一系列转换得到对应的汉字,那么我们完全可以把每个数字得到的转换后的汉字都显示出来,做出对应表,要知道每一位的数字只有0-9这10个结果。我们打开模拟器中的app,在输入密码处依次输入0123456789,得到相对应的结果,然后pw对应的密码也可以马上得出:581026
最后将结果输入试一下,bingo!果然成功!
算法逆向
当然上面的快捷方法适合比赛的时候用,而且不具有普遍性。在我们练习的时候还是要尽量将算法进行解析,找到解决的策略,这里参考了一个别人的博客的内容,自己简单写了一点代码做练习了一下。首先我们之前静态详细分析的时候已经分析了几个关键函数,其中bytesToAliSmsCode可以说是一种加密的算法,然后在这个代码的附近我们很快就找到了解密的算法,aliCodeToBytes,那么我们就可以用这个解密的算法写一个小demo,将密码得到。
这里贴上代码,其中table和pw中的字符串都是monitor中捕获的log内容
import java.lang.*; public class Ali{ static String table; static String pw; public static void main(String[] args){ table=new String("一乙二十丁厂七卜人入八九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐"); pw=new String("义弓么丸广之"); System.out.println(new String(aliCodeToBytes(table,pw))); } private static byte[] aliCodeToBytes(String codeTable,String strCmd){ byte[] v1=new byte[strCmd.length()]; int i; for(i=0;i<strCmd.length();++i){ v1[i]=((byte)codeTable.indexOf(strCmd.charAt(i))); } return v1; } }
运行之后得到密码值,和我们之前快捷方法得到的值是一样的。
最后的总结:这次的题目还是比较简单的,主要练习了静态分析能力,注重代码逻辑分析的思想,以及monitor的使用等:-)
相关文章推荐
- CTF安卓逆向练习第二弹
- CTF安卓逆向练习第五弹
- 安卓逆向之华山杯ctf第一题:错错错
- 安卓逆向之华山杯ctf第二题:寻找密码
- [置顶] CTF--信息技术对抗赛ISCC之安卓逆向分析
- 安卓逆向之华山杯ctf第四题:神奇的zip
- ctf.360.cn第二届,逆向部分writeup――第三题
- 170920 逆向-CTF练习平台(RE-love)
- 蓝鲸ctf 逆向0x4 逆向练习
- BugKuCTF(CTF-练习平台)——WEB-web基础$_GET
- 实验 7 综合练习 第三题
- 安卓逆向的一个小例子,顺便分享安卓逆向视频教程
- 安卓逆向(一)
- 逆向某m-安卓APP记录
- 安卓逆向DDMS不显示待附加进程解决思路
- Android逆向工程-第三部分
- ctf.360.cn第二届,逆向部分writeup――第四题
- bugku ctf Reverse 逆向入门 writeup
- 安卓逆向分析实战(一)--逆向工具介绍与安装
- 180114 逆向-安卓绕过第三方模块(某易验证码)